回答:
bash
いくつかのメタキャラクターを定義します。からman bash
:
メタ
文字引用符で囲まれていないときに単語を区切る文字。次のいずれか:
| &; ()<>スペースタブ
メタキャラクターは単語を分離するため、スペースで囲まれているかどうかは関係ありません。パイプ記号、|
はメタキャラクターであるため、お気づきのように、周囲にスペースは必要ありません。
なお[
、]
、{
、}
、と=
しているではないメタ文字。対照的に、それらの意味は、空白で囲まれているかどうかに大きく依存します。
お気づきのように、|
スペースで囲まれているかどうかは関係ありません。一般的にbashユーザーを混乱させるいくつかの例を考えてみましょう。考慮してください:
$ (date)
Sun Mar 1 12:47:07 PST 2015
上記の括弧は、date
コマンドを強制的にサブシェルで実行します。(
と)
はメタ文字であるため、スペースは必要ありません。対照的に:
$ {date}
bash: {date}: command not found
{
と}
はメタ文字ではないため、シェルは{date}
1つの単語として扱います。date
コマンドを探す代わりに、という名前のコマンドを探し{date}
ます。見つからないため、エラーが発生します。
別の一般的な問題はtest
コマンドです。以下が正常に機能します。
$ [ abc ] && echo Yes
Yes
スペースを削除すると、エラーが発生します。
$ [abc] && echo Yes
bash: [abc]: command not found
[
と]
はメタ文字ではないため、シェルは[.bashrc]
単一の単語として扱い、結果はdate
例のようにエラーになります。
割り当てステートメントもスペースに敏感です。次の割り当てが成功します。
$ v=date
$ echo $v
date
スペースを追加すると、割り当てが失敗します。
$ v= date
Sun Mar 1 12:55:05 PST 2015
上記では、シェルは一時的v
に空に設定してからdate
コマンドを実行します。
前にスペースを追加して=
もエラーが発生しますが、理由は異なります:
$ v =date
bash: v: command not found
ここで、シェルv
は引数を指定してコマンドを実行しようとします=date
。エラーは、という名前のコマンドが見つからなかったためv
です。
=
。デバッグに時間がかかりました。
パイプを使用すると、プログラムの出力を別のパイプの入力として使用できます...
スペースに関しては、@ jasonwryanが言及したように、読みやすさ/人員の好みの問題だけです。
「|」の前後に1つのスペースバー 基準です....
列-tとともに使用して、1つのライナーをきれいにするだけでなく、出力もできます。
lnydex99uhc:depot_r user$ lsof | grep my | column -t
Microsoft 290 user txt REG 1,4 9515016 170972 /Library/Fonts/PCmyoungjo.ttf
bash 359 user cwd DIR 1,4 714 12246074 /Users/zatef/hw2/base/active/myapp
スペースを使用しないと便利な場合が1つあります。US-Americanレイアウトを使用していない場合AltShiftL、パイプの入力などのいくつかの組み合わせの使用を強制される場合があります 。これ自体は問題ではありませんが、結果の1つは、その文字の前または後に非印刷文字を入力することもあることです。たとえば、フランス語版のMacbook Proキーボードでは、を使用AltShiftLして入力する必要があります|
。すばやく入力すると、誤ってこれを入力することができますAltShift(L、Space)
$ sudo dmesg | tail
zsh: command not found: tail
echo "sudo dmesg | tail" | od -a
0000000 s u d o sp d m e s g sp | � � t a
0000020 i l nl
AltShiftSpace別のスペース(非改行スペース(U + 00A0))を入力することに気付いていない場合、次のエラーを理解するのは困難です。zsh: command not found: tail
この場合のスペースの唯一の重要性は美学です。
または、言い換えると、コマンドを人間にとって読みやすくするのに役立ちます。