パイプの隣のスペース


17

私が見たhistory | grep blahhistory |grep blah; そしてhistory|grep blah誰もそれを使用するようだけれどもまた、動作します。

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


13
主に読みやすさ。
jasonwryan

1
|パイプまたは;セミコロンは、コマンドの区切り文字としてほとんどのシェル(bash、ksh、tcsh)で使用されます。前後の引用空白で囲まれていない場合は意味がありません。
アルケマール

回答:


24

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です。


1
私は最近、割り当て声明の犠牲になりました。の前後にスペースがありました=。デバッグに時間がかかりました。
トファー

3

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

スペースに関しては、@ 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

2

スペースを使用しないと便利な場合が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別のスペース(非改行スペース(U + 00A0))を入力することに気付いていない場合、次のエラーを理解するのは困難です。zsh: command not found:  tail


1

この場合のスペースの唯一の重要性は美学です。
または、言い換えると、コマンドを人間にとって読みやすくするのに役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.