2015-01-02 14 views
7

EDIT 2: "ls *()"を実行しても、bashは1CPUの100%を返して使用しません。誰がなぜbashがこれをやっているのか知っていますか?bashのプログラムに引数として "*()"を渡す

私はCを学んでいて、引数について学んでいて、引数として渡されたときにどんな文字が奇妙なことをするのだろうと思っていました。バッシュは、Ctrlを押しながらCまたはCtrl Zで終了することができませんでした

$ ./program *() 

:私は次のようにbashの経由Cプログラムに引用符なし ")(*" を可決しました。私がhtopを見たとき、それは1つのCPUの100%を使用していました。私はそれをSIGKILLしなければなりませんでした。誰がここで何が起こっているのか知っていますか?ただ興味があるだけ。

EDIT:この動作が発生し

でも簡単なプログラム

#include <stdio.h> 
int main(int argc, char *argv[]){ return 0; } 

+0

どのようなプログラムですか? –

+1

引用符で囲まれていない括弧のため、あなたは 'bash'から構文エラーを受け取ったはずです。 – chepner

+1

@chepner 'ls *()'は私のシステムで何の役にも立ちませんが、括弧についてbashからエラーが出ることはありません。 – hetepeperfan

答えて

5

これはバージョン4.3.16で修正されたbashの既知のバグです。あなたの.bashrcまたはいくつかの他のinitファイルに

shopt -s extglob 

のようなコマンドを持っている場合extglob機能は、例えば、有効になっている場合にのみ発生します。

私はLinuxのミント17上のbash 4.3.11とそれを一貫して再現することができます。

$ bash --norc 
bash-4.3$ mkdir empty 
bash-4.3$ cd empty 
bash-4.3$ echo *() 
bash: syntax error near unexpected token `(' 
bash-4.3$ shopt -s extglob 
bash-4.3$ echo *() 

シェルは最後のコマンドの後にハングアップします。空のディレクトリで実行したことに注意してください。この問題は、空でないディレクトリでも発生します。

bashのマニュアル文書extglobが有効になっている場合にのみ有効ですワイルドカードの形式は:

`*(PATTERN-LIST)' 
    Matches zero or more occurrences of the given patterns. 

*()を考えると、それは空の文字列の0回以上の繰り返しです。任意の文字列に空の文字列が無限に出現するので、それを避けるための特殊なコードがないと、無限ループが発生する可能性があります。

これは、それ以降のバージョンで修正されているようです。私は4.3.11の問題を見ていますが、4.3.30の問題はありません。 riciのコメントは、パッチ016がそれを修正した可能性が高いことを示唆しています。私はそれはバグだことを確認して言うだろう

1) bash gets stuck 

shopt -s extglob 
echo !(*/) # never returns, cannot be interrupted 

:パッチに対応するbug reportはこれを含んでいます。

+1

私が推測しているのは、011と030の間にある唯一のパッチでパッチ016で修正されたことです。これはglob関数に当てはまります。 – rici

+0

@rici:はい、それはほぼ確実です。 –

0

strace -p pidで何が行われているのか分かります。再起動後の動作は再現可能ですか? BashはCentOS 6.3で試したときに私に構文エラーを与えました。あなたのシステムで何かが破損していると思われますが、おそらく実行中のカーネル内、たぶんprocテーブル内だけにあるかもしれません。

tn:11: cat program.c 
#include <stdio.h> 
int main(int argc, char *argv[]){ return 0; } 
tn:12: gcc program.c 
tn:13: ./a.out *() 
bash: syntax error near unexpected token `(' 
tn:13: bash -version 
GNU bash, version 4.1.2(1)-release (i386-redhat-linux-gnu) 
tn:14: uname -a 
Linux localhost.localdomain 2.6.32-279.11.1.el6.i686 #1 SMP Tue Oct 16 14:40:53 UTC 
2012 i686 i686 i386 GNU/Linux 
tn:15: cat /etc/redhat-release 
CentOS release 6.3 (Final) 
tn:16: gcc --version 
gcc (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4) 
+0

これは既知のbashバグです。私の答えを見てください。 –