web-dev-qa-db-ja.com

パイプ横のスペース

私は見た history | grep blahおよびhistory |grep blah;およびhistory|grep blahも機能しますが、誰も使用していないようです。

スペースに何らかの意味がありますか(たとえば、異なるコマンドへのパイプからのパイプは、スペースの使用が異なる必要があります)、または常に任意ですか?

17
EmmaV

bashは、いくつかのメタ文字を定義します。 man bashから:

メタキャラクター
引用符で囲まれていない場合に単語を区切る文字。次のいずれか:
| &; ()<>スペースタブ

メタ文字は単語を分離するため、スペースで囲まれているかどうかは問題ではありません。パイプ記号|はメタ文字であるため、気づいたように、スペースを必要としません。

[]{}、および=notメタ文字であることに注意してください。対照的に、それらの意味は、空白で囲まれているかどうかに大きく依存します。

スペースが必要な場合と不要な場合の例

お気づきのとおり、|がスペースで囲まれているかどうかは問題ではありません。 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

ここで、シェルは引数=dateを使用してコマンドvを実行しようとします。エラーは、vという名前のコマンドが見つからなかったためです。

23
John1024

パイププログラムの出力を別のプログラムの入力として使用できます...

スペースに関する限り、@ jasonwryanが言及したように、読みやすさ/人事選好の問題だけです。

「|」の前後に1つのスペースバー規範です...

Column -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
3
zee

スペースを使用しないほうが便利な場合が1つあります。 US-Americanレイアウトを使用していない場合は、次のようないくつかの組み合わせを使用する必要がある場合があります。 AltShiftL パイプを入力します。これ自体は問題ではありませんが、1つの結果として、その文字の前または後に非印刷文字も入力することがあります。たとえば、フランスのMacbook Proキーボードでは、 AltShiftL 入力する|。すばやく入力すると、誤って次のように入力する可能性があります。 AltShiftLSpace

$ 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 別のスペースを入力すると(改行しないスペース( + 00A ))、次のエラーは理解しにくい場合があります:zsh: command not found:  tail

2
alecail

この場合のスペースの唯一の重要性は、美学です。
つまり、コマンドを人間が読みやすくするのに役立ちます。

1
asoundmove