Bashのマンページでは、このオプションを次のように説明します-c
。
-c -cオプションがある場合は、オプションではなく最初の引数command_stringからコマンドを読み取ります。 command_stringの後に引数がある場合、最初の引数は$ 0に割り当てられ、残りの引数は位置引数に割り当てられます。 $ 0の指定は、警告メッセージとエラーメッセージに使用されるシェルの名前を設定します。
上記から、次のコードは出力で同じと予想されます。
# or possibly (`bash -c date date +%z`)
$ bash -c date +%z
Wed Oct 18 10:02:47 PM UTC 2023
$ date +%z
+0000
# The first command gives the output of `date` without the format specifier.
しかし、私のbash(GNU bash、バージョン5.2.15)は、追加のコマンドライン位置引数を評価しないようです。オプションの後の最初の引数以降のすべての項目は-c
自動的に削除されます。たぶん私はマニュアルページを誤解したかもしれません。
bash -c
文字列()以外の単語(デフォルトのargベクトル)でコマンドに複数の引数を渡すにはどうすればよいですかbash -c "date +%z"
?可能ですか?
コンテキスト
この質問の目的は、bashがコマンド引数を渡してexecve()
他のプログラム(ラッパーシェル)の関数系列の1つを介してbashに正しく入力できることを理解することです。
答え1
最初のパラメータは$ 0に割り当てられます。
$ 0は最初のパラメータではなく、$ 1は最初のパラメータです。また、コマンド文字列のパラメータを使用する必要があります。
bash -c 'date "$1"' zero +%z
答え2
ここでは、
bash -c date +%z
-c
is 次の最初の非オプション引数は、date
Bash が解析して実行するシェルコードです。その後の引数はシェルまたはスクリプト名$0
(ここで+%z
)に割り当てられ、位置引数$1
... $2
(ここではすべて設定されていません)に割り当てられます。
文字列は+%z
破棄されませんが、コマンドは使用(またはなど)されdate
ないため、シェルの動作には影響しません。ただし、シェルがエラーメッセージを印刷する必要がある場合に使用されます。たとえば、$0
$1
$ /bin/bash -c datexxx +%z
+%z: datexxx: command not found
スクリプトはコマンドを見つけることができないため、スクリプトで指定したdatexxx
名前(+%z
)が先に付けられたエラーメッセージを出力します。
次のパラメータとシェルコードを使用するには、スクリプト名または場所パラメータを使用してコマンドを-c
渡す必要があります。例:$0
$1
% bash -c 'echo "script name: $0", first arg: "$1"' foo bar doo
script name: foo, first arg: bar
ただし、引数リストをそのまま別のコマンドに渡したい場合は、(すべての設定で位置引数を実行するのと同じ"$@"
ように)(引用符を含む)を使用して、すべての位置引数を一意のフィールドに拡張することをお勧めします"$1" "$2" ...
。
したがって(GNU日付が仮定されている-d
):
% bash -c 'date "$@"' my-inline-script +"%F %T" -d '1 Jan 2001'
2001-01-01 00:00:00
(これはシェルがエラーメッセージを印刷するときにのみ使用されますmy-inline-script
。上記の例は、説明的な内容をそこに入れるのがなぜ意味があるのかを示しています。$0
$0
答え3
パラメーターは-c
文字列でなければなりません。残りはパラメータ$0
、、、$1
...になります。
例:
bash -c 'echo name=$0 params=$*' a b c
出力:name=a params=b c
ここでは一重引用符を使用することが重要です。現在、シェルが等$0
の値を埋めることを許可していないからです。$*
現在のシェルから値を取得するには、二重引用符を使用します。たとえば、
X=42
bash -c "echo $X"
出力:42
一重引用符と二重引用符を混在させることも可能です。次のパラメータが-c
まだ文字列である限り。
X=42
bash -c "echo $X"' 0=$0 $*'
出力:(42 0=bash
ここでは$0
デフォルトbash
)