2017-03-02 4 views
1

私は、このコマンドのラッパーとして小さなスクリプトを作成しようとしている:なぜbashスクリプトはアスタリスク付きの文字列に一重引用符を追加するのですか?

$ egrep target /usr/lusers/me/test/*test.txt 
/usr/lusers/me/test/1test.txt:target 

ディレクトリは、私が検索したいいくつかのテキストが含まれているそのうちの一つ1test.txt2test.txtと呼ばれるファイルを、持っていること。ここで
は私の全体のスクリプトで、mygrep.shと呼ばれる:

set -v 
set -x 
egrep "$1" '/usr/lusers/me/test/*test.txt' 

ここでは出力です:

$ ./mygrep.sh target 
set -x 
egrep "$1" '/usr/lusers/me/test/*test.txt' 
++ egrep targ '/usr/lusers/me/test/*test.txt' 
egrep: /usr/lusers/me/test/*test.txt: No such file or directory 

set -x出力のファイルパスの周り' sが、コマンドが失敗していること。唯一の違いは、文字ファイル名対アスタリスクであることを

set -v 
set -x 
egrep "$1" '/usr/lusers/me/test/1test.txt' 

注:

は今、スクリプトのこの変化を比較します。
出力:

$ ./mygrep.sh target 
set -x 
egrep "$1" '/usr/lusers/me/test/1test.txt' 
++ egrep target /usr/lusers/me/test/1test.txt 
target 

拡張後の単一引用符、およびコマンドの作品。

なぜ、アスタリスクがあるときに一重引用符が追加され、その場合にコマンドが失敗するのはなぜですか?

答えて

2

set -xの出力はデバッグ用です。引数に引用符は追加されません。彼らは表示目的のためだけです。

正しいコマンドはegrep "$1" /usr/lusers/me/test/*.test.txtです。シェルは結果をegrepに渡す前にパターンを展開する必要があります(可能な場合)。 *.test.txtという名前の実際のファイルがありません。

+0

egrepに滅菌してそこに展開させる。私はそれが問題ではないと思いますが、それは可能ですか? – P1h3r1e3d13

+3

@ P1h3r1e3d13グローブ(つまり、式に基づいて一致するファイル名を生成する)はシェルの機能であり、 'egrep'ではありません。アスタリスクが 'egrep'にすると、そのユーティリティのリテラルアスタリスクになります。 – Fred

+0

Gotcha、ありがとう。 – P1h3r1e3d13

1

引用符はグロブを無効にするため、引用符は外部(単一引用符または二重引用符)でなければなりません。

使用この代わりに:

egrep "$1" '/usr/lusers/me/test/'*'test.txt' 

またはこの:単語の分割が発生する原因となるこの特定のパターンの内部は何もありませんので、

egrep "$1" "/usr/lusers/me/test/"*"test.txt" 

あるいは、(それは一般的ではないでしょうパスが事前に安全でないとわからない場合は安全な方法):

egrep "$1" /usr/lusers/me/test/*test.txt 
関連する問題