なぜエコなの? |文字を標準出力に返す

なぜエコなの? |文字を標準出力に返す

このコマンドの出力を理解しようとしていますecho ?。私が見る出力は1|文字です。

答え1

?シェルの特殊なワイルドカード文字だからです。 $ abcが存在しないため、空の文字列に展開され、?現在のディレクトリにある単一の文字ファイルまたはディレクトリに置き換えられます。したがって、|現在のディレクトリに名前が付けられたファイル/ディレクトリがある可能性があります。

私のシステムでは、出力が異なります。

$ echo $abc?
_ 1

単一文字のファイル/ディレクトリがない場合、ファイル/ディレクトリは?拡張されません。

実際にディレクトリ_1

答え2

なぜですか??デフォルトでは、次を意味するグローバル文字()を含む単語に分割されます。

globと一致する現在のディレクトリのファイル名のリストを印刷します?

globは?単一文字を持つすべてのファイルと一致します。したがって、これはうまくいきます。

$ touch a \| b
$ echo ?
| a b
$ ls -l ?
-rw-r--r-- 1 user user 0 Dec 29 10:03 '|'
-rw-r--r-- 1 user user 0 Dec 29 10:03  a
-rw-r--r-- 1 user user 0 Dec 29 10:03  b

これは、文字を含むファイル/ディレクトリが存在しない場合に発生します。

$ rm a \| b
$ echo ?
?

これはデフォルト設定を使用したbashの出力です。
ファイルを明確に表示するには:

$ ls -l ?
ls: cannot access '?': No such file or directory

有効にすると、nullglob出力は印刷されません。

$ shopt -s nullglob
$ echo ?
$

関連情報