コンパイルされたコマンドラインプログラムがbashまたはcshに、パラメーター内のワイルドカード文字を展開したくないことを通知する方法はありますか?
たとえば、次のようなシェルコマンドが必要になる場合があります。
foo *
その文字のASCII数値を返すだけです。
回答:
いいえ。拡張は、コマンドが実際に実行される前に行われます。
コマンドを実行する前、または星を引用することによってのみ、グロブを無効にすることができます。
$ # quote it
$ foo '*'
$ # or escape it
$ foo \*
$ # or disable the glob (noglob)
$ set -f
$ foo *
$ # alternative to set -f
$ set -o noglob
$ # undo it by
$ set +o noglob
set -f
?それunset -f
ですか?
set +f
コマンド自体がグロブをオフにすることはできないのは事実ですが、ユーザーが特定のコマンドをグロブしないようにUnixシェルに指示することは可能です。これは通常、シェルの構成ファイルを編集することによって実現されます。コマンドfoo
がコマンドパスに沿って見つかると仮定すると、適切な構成ファイルに以下を追加する必要があります。
sh、bash、kshシェルの場合:
alias foo='set -f;foo';foo(){ command foo "$@";set +f;}
cshおよびtcshシェルの場合:
alias foo 'set noglob;\foo \!*;unset noglob'
zshシェルの場合:
alias foo='noglob foo'
コマンドパスを使用する必要はありません。コマンドfooがディレクトリ〜/ binに格納されているとすると、上記は次のようになります。
sh、bash、kshシェルの場合:
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
cshおよびtcshシェルの場合:
alias foo 'set noglob;$home/bin/foo \!*;unset noglob'
zshシェルの場合:
alias foo='noglob ~/bin/foo'
上記のすべては、AppleのOSX10.9.2を使用してテストされました。注:上記のコードをコピーするときは、スペースの削除に注意してください。それらは重要かもしれません。
ユーザーgeiraは、bashシェルの場合はそれを指摘しています
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
で置き換えることができます
reset_expansion(){ CMD="$1";shift;$CMD "$@";set +f;}
alias foo='set -f;reset_expansion ~/bin/foo'
これにより、関数fooが不要になります。
このドキュメントの作成に使用されたいくつかのWebサイト:
拡張は、プログラムが実行される前にシェルによって実行されます。あなたのプログラムは、拡張が起こったかどうかについての手がかりを持っていません。
set -o noglob
呼び出しシェルで拡張をオフにしますが、プログラムを呼び出す前にそれを行う必要があります。
別の方法は、あなたの議論を引用することです。
foo "*"
set -o noglob
ワイルドカード拡張を無効にするために使用します。
注意:マスクに一致する名前がない場合、bashは展開せずに引数をそのまま渡します!
証明(pa.pyは非常に単純なスクリプトであり、引数を出力するだけです):
$ ls
f1.cc f2.cc pa.py
$ ./pa.py *.cc
['./pa.py', 'f1.cc', 'f2.cc']
$ ./pa.py *.cpp
['./pa.py', '*.cpp']
set -o nullglob
またはshopt -s failglob
、この動作は変化します(2つの非常に異なる方法で)。
pwd
場合echo *
は、ちょうど*