bash -cコマンド解析

bash -cコマンド解析

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

-cis 次の最初の非オプション引数は、dateBash が解析して実行するシェルコードです。その後の引数はシェルまたはスクリプト名$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

関連情報