簡體   English   中英

如何在命令替換中將所有 bash arguments 傳遞給 bash -c?

[英]How to pass all bash arguments to bash -c within command substitution?

我正在嘗試有條件地將腳本 arguments 傳遞給bash -c ,它本身被傳遞給docker run命令。 下面的示例說明了我正在嘗試做的事情。

#!/bin/bash

echo "Args: ${@}"
docker run ubuntu \
  $( if [[ ! -z ${@} ]]; then echo "bash -c ${@}"; fi )

docker run ubuntu \
  $( if [[ ! -z ${@} ]]; then echo "bash -c \"${@}\""; fi )

對於呼叫./myscript.sh ls -la ,這給了我以下 output。

Args: ls -la
bin
boot
dev
etc
home
lib
lib32
lib64
libx32
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
-la": -c: line 0: unexpected EOF while looking for matching `"'
-la": -c: line 1: syntax error: unexpected end of file

如您所見,第一個docker run調用有效,但忽略了也已通過的-la標志。 我曾想過嘗試將傳遞給bash -c的命令(即ls -la )括在轉義引號中,但這根本不起作用。

我怎樣才能實現所需的行為? 提前致謝!

你基本上是在做一個

bash -c ls -la

如果您在命令行上執行相同的命令,您可以重現這一點:它會給出相同的結果。

從 bash 手冊頁關於-c選項:

... 命令從第一個非選項參數 command_string 中讀取。 如果在 command_string 之后有 arguments,則第一個參數分配給 $0,其余的 arguments 分配給位置參數。 對 $0 的賦值設置 shell 的名稱,用於警告和錯誤消息。

因此, -la不會作為參數傳遞給ls 你必須做一個

bash -c "ls -la"

如果我正確理解您的代碼,如果參數列表為空,您不想在 docker 上運行 arguments。 然后我會嘗試

(( $# > 0 )) && docker run ubuntu bash -c "$*"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM