パイプ横スペース

パイプ横スペース

私は見たことがhistory | grep blahありますhistory |grep blahhistory|grep blahそれも効果がありますが、誰もそれを使用していないようです。

空白にはどのような意味がありますか(たとえば、他のコマンドをパイピングするには別の空白を使用する必要があります)、または常にランダムですか?

ベストアンサー1

bashいくつか定義されています。メタ文字。からman bash

メタ文字
引用符がない場合、単語を区切るために使用される文字です。次のいずれか:
&; ()<>スペースタブ文字

メタ文字は単語を区別するため、スペースで囲まれているかどうかは重要ではありません。パイプ記号|はメタ文字なので、分かるように周囲にスペースは必要ありません。

[]{および 銀}=いいえメタ文字。対照的に、その意味は空間に囲まれているかどうかによって大きく異なります。

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

|ご存知のように、空間に囲まれているかどうかは問題ではありません。 bashユーザーをしばしば混乱させるいくつかの例を考えてみましょう。考慮する:

$ (date)
Sun Mar  1 12:47:07 PST 2015

上記の括弧は、dateコマンドがサブシェルで実行されるように強制します。(とはメタ文字なので、)スペースは必要ありません。比較してみると:

$ {date}
bash: {date}: command not found

なぜなら{}いいえシェルが{date}単語として扱うメタ文字です。コマンドを探すのではなく、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

おすすめ記事