シェルは「?」文字を食べる

シェルは「?」文字を食べる

これは非常に簡単な質問で、誰かがどこかに質問したようですが、見つかりません。意図的にこれを行うように設定されていない私のシェルは、疑問符を含むすべての単語を食べるようです。

$ bash --version
GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin13.4.0)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ echo a ? = =?
a =

$ not-a-command? echo a
a

$ (?) echo a
a

重要な内容であれば参考にしてくださいどの疑問符を含む単語は完全に静かに消えているように見えたため、彼女のシェルは疑問符が最初に見つからなかったにもかかわらず、有効な実行可能ファイルを指定しなかった単語で呼び出しが開始されたことにも気づかなかった。

答え1

シェルオプションが有効になっている可能性があります。nullglobこれにより、ワイルドカード文字を含む*すべての単語が削除されます。?したがって、単一の文字名を持つファイル、フォルダなどが含まれていないフォルダにある場合は、何も展開せずに再度削除され、何も一致せずに代わりに?削除not-a-command?されます。 。

これが真であることを確認するには、次のように実行します。

shopt nullglob

このオプションを無効にするには、次の手順を実行します。

shopt -u nullglob

答え2

と似ています*が、単一文字を表します。

たとえば、3 文字で構成されるルート ディレクトリを表示します。

$ ls -d /???
/bin  /dev  /etc  /lib  /mnt  /opt  /run  /sys  /tmp  /usr  /var

/home一致しないため表示されない注意

[?]または、またはを使用して\?文字列を引用符("foo?"または'bar?')で囲みます。

関連情報