コンパイルされたコマンドライン プログラムが 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
コマンド自体がグロビングをオフにできないのは事実ですが、ユーザーが 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 の OSX 10.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 "*"
注意: マスクに一致する名前がない場合、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']