コマンドパラメータの位置

コマンドパラメータの位置

すべてのコマンドのパラメータ位置は固定されていないようです。

たとえば、cp -r ./abc ./defcp ./abc ./def -rは同じで、grep -rnH hello .同じgrep hello . -rnHです...

ところで今日使ってみるとldd私が間違っていたことに気づきました。なぜならldd -r x.soとはldd x.so -r違うからです。 2番目のコマンドでエラーが発生しました。

ldd: ./-r: No such file or directory

なぜパラメータの位置を変更できないのですかldd

答え1

一部のGNUユーティリティは、オプションとオプションの引数がオペランドの前になるようにコマンドライン引数を自動的に再構築します。これは標準的な動作ではありません。

標準準拠ユーティリティは、オプションとオプションの引数が最初に表示されると予想し、コマンドラインパーサーがオプションではなく最初の引数を見つけた場合、残りの引数はオペランドとして扱われます。

cp -i file1 file2

上記の場合、最初のパラメータはオプションで、最後の2つのパラメータはオペランドです。

cp file1 file2 -i

上に3つのオペランドがあります。 GNU以外の実装では、sumを名前付きディレクトリにコピーcpします(そのようなディレクトリがない場合はエラーメッセージが表示されます)。一方、GNUはそれをオプションとして見て、ファイルがあれば上書きするかどうかを尋ねます。file1file2-icp-ifile2

この動作は環境変数を設定することで変更できますPOSIXLY_CORRECT

$ cp file1 file2 -i
cp: overwrite 'file2'? n

$ POSIXLY_CORRECT=1 cp file1 file2 -i
cp: target '-i' is not a directory

またはあなたは--使用することができます明らかにオプションの終わりを表示します。これは、コマンドがGNUモードでオプションを解析するかどうかに関係なく機能します。

$ cp -- file1 file2 -i
cp: target '-i' is not a directory

これは次の点で覚えておくべきことです。

grep 'PATTERN' *.txt

GNUの場合は、次のようにgrep書く必要があります。

grep -- 'PATTERN' *.txt

または

grep -e 'PATTERN' -- *.txt

いくつかのファイルPATTERN.txt名前-

システム(GNU APIを使用せずにオプションを手動で解析するスクリプトであるlddGNUシステム)は、「GNU方式」でコマンドライン引数を解析しません。これは(IMHO)正しく行われます。bashgetopt_long()


GNUドキュメントからgetopt_long(3)

デフォルトでは、スキャン時にオプション以外のすべての項目が最後になるようにgetopt()コンテンツがソートされます。 [...] isまたは環境変数の最初の文字argvが設定されている場合、オプションではなく引数が見つかるとすぐにオプションの処理が停止します。optstring+POSIXLY_CORRECT

関連情報