すべてのコマンドのパラメータ位置は固定されていないようです。
たとえば、cp -r ./abc ./def
とcp ./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はそれをオプションとして見て、ファイルがあれば上書きするかどうかを尋ねます。file1
file2
-i
cp
-i
file2
この動作は環境変数を設定することで変更できます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を使用せずにオプションを手動で解析するスクリプトであるldd
GNUシステム)は、「GNU方式」でコマンドライン引数を解析しません。これは(IMHO)正しく行われます。bash
getopt_long()
GNUドキュメントからgetopt_long(3)
:
デフォルトでは、スキャン時にオプション以外のすべての項目が最後になるように
getopt()
コンテンツがソートされます。 [...] isまたは環境変数の最初の文字argv
が設定されている場合、オプションではなく引数が見つかるとすぐにオプションの処理が停止します。optstring
+
POSIXLY_CORRECT