2017-09-07 4 views
8

私はps auxからの出力をキャプチャしています:二重引用符がlinuxのこれらのecho文の出力に影響するのはなぜですか?

current_processes=`ps aux | grep "tempdir" | tail -3` 

を、私はそれをエコーするとき、それはこの

echo $current_processes 
19984 10089 17784 

とするとき、私echoプラス二重引用符も、それはこのようになりますようになります:

echo "$current_processes" 
19984 
10089 
17784  

なぜ私は二重引用符を使用していても二重引用符を使用していない場合、これらを新しい行に挿入しますか?

答えて

3

効果はシェルから発生します。二重引用符を使用しない場合、シェルは改行、タブ、スペースをスペースで置き換えます。この代入は二重引用符で避けることができます。詳細についてはbash(1)のmanページ内のセクションWord Splittingを参照してください:

ワード分割

シェルは、二重 内で発生していないパラメータ展開、コマンド置換、数式展開の結果をスキャン単語分割のための引用符。

シェルは、IFSの各文字を区切り文字として扱い、その他の展開の結果をこれらの文字の単語に分割します。 IFS が設定されていないか、その値が正確であれば、デフォルト値は です。IFS文字のシーケンスは、単語の区切りに使用されます。 IFS にデフォルト以外の値が設定されている場合、空白文字がIFSの値である限り、 文字スペースとタブのシーケンスは、 ワードの先頭と最後で無視されます( IFS空白キャラクター)。 IFS内のすべての文字は、IFS white- スペースで、隣接するIFS空白文字とともに、 フィールドを区切ります。一連のIFS空白文字は、 区切り文字としても扱われます。 IFSの値がNULLの場合、ワード分割は発生しません。

IFSの内容はecho "$IFS" | xxdです。

00000000: 2009 0a0a         ... 

これは、スペース(0x20)、タブ(0x09)、改行(0x0a)を意味します。 2番目の0x0aはechoコマンドに由来します。

あなたは空の文字列にIFSを設定することで、この置換を避けることができます。

IFS="" 
echo "$current_processes" 
19984 
10089 
17784 

しかし、私はこのことをお勧めしません。

+0

ありがとうございます@macmoonshine! – Hunle

関連する問題