「sh -c」の「name」パラメータはどのように使用されますか?

「sh -c」の「name」パラメータはどのように使用されますか?

からインポートFreeBSD マニュアルページshで(オンラインで最も便利な方法なので、重要な場合はターゲットプラットフォームはDebianです):

SH(1)           FreeBSD General Commands Manual          SH(1)

NAME
     sh -- command interpreter (shell)

SYNOPSIS
     sh [-/+abCEefhIimnPpTuVvx] [-/+o longname] [script [arg ...]]
     sh [-/+abCEefhIimnPpTuVvx] [-/+o longname] -c string [name [arg ...]]
     sh [-/+abCEefhIimnPpTuVvx] [-/+o longname] -s [arg ...]
...

特に、次のユースケースに興味があります。

sh [-/+abCEefhIimnPpTuVvx] [-/+o longname] -c string [name [arg ...]]

例:

# Normal:
myscript hello world
myscript hello world >/var/log/myscript.combined 2>&1

# Constrained:
#  - Arguments 'hello' and 'world' are suffixed by calling program.
myscript >/var/log/myscript.combined 2>&1 hello world

# Constrained Further:
#  - Wrapped in `sh` to catch system messages, like Segmentation Fault

sh -c 'myscript $@' _ >/var/log/myscript.combined 2>&1 hello world

myscript最初のパラメータが渡されず、文書にパラメータが含まれていることを確認しましたが、文書部分は表示されませnameん。私の例では、_nameパラメータの代わりに広告を追加しましたが、次のようになります。

何を満たすべきですかname

答え1

シート:

sh -c '...' name arg1 arg2 ...

通常、find ... -exec sh -c '...' find-sh {} +インラインスクリプトで$0はに設定され、name残りのパラメータはで埋められます$@

通常、エラーメッセージを表示するために使用されるため、意味のある値に設定する必要があります。

sh -c 'echo "${1?}"' foo
foo: 1: foo: 1: parameter not set

nameただし、インラインスクリプトの名前を示すために任意の単語に設定できます。

sh -c 'printf "%s\n" "$0"' custom-sh 1 2 3
custom-sh

この動作は次のように定義されます。POSIX

答え2

Linuxのマニュアルページは非常に詳細です。

sh -c [-aCefnuvxIimqVEb] [+aCefnuvxIimqVEb] [-o オプション名] [+o オプション名] コマンド文字列 [コマンド名 [パラメータ...]]

-氏 標準入力の代わりに command_string オペランドからコマンドを読み込みます。特殊パラメータ0はcommand_nameオペランドで設定され、位置パラメータ($ 1、$ 2など)は残りのパラメータオペランドで設定されます。

コマンド名command_stringでコマンドを実行したときに特殊パラメータ0に割り当てられた文字列。 command_nameが指定されていない場合、特殊引数0は、親からshに渡される最初の引数の値に設定する必要があります(たとえば、Cプログラムの場合はargv [0])。これは通常、shの実行に使用される値です。ユーティリティ。

関連情報