最初の行:
echo $(ps | grep $PPID) | cut -d" " -f4
言います:
ps | grep $PPID
を実行 サブシェル内-
出力を返します - これは次のようになります:
3559 pts/1 00:00:00 bash
次に、その出力を echo の最初のパラメーターとして使用します。実際には、出力を単にエコーすることを意味します
- 次に
cut -d" " -f4
を実行します その上で - この場合、コマンド名が得られます
2 番目のコマンド:
echo ps | grep $PPID | cut -d" " -f4
言います:
- エコー文字列
ps
$PPID
の文字列を grep -$PPID
のように、これは何も返しません。 数字が含まれているため、ps
になることはありません .したがって、grep は何も返しませんcut -d" " -f4
を実行 前のコマンドの入力で - これは何もないので、何も得られません
その理由は
echo ps
文字列 ps
を出力するだけです;プログラム ps
を実行しません .コマンドの修正版は次のようになります:
ps | grep $PPID | cut -d" " -f4
追加のために編集: paxdiablo は ps | grep $PPID
を指摘しています echo $(ps | grep $PPID)
で折りたたまれる多くの空白が含まれています ( $(...)
の結果から 、二重引用符で囲まれていない場合は、空白で別々の引数に分割され、次に echo
スペースで区切られたすべての引数を出力します)。これに対処するには、 tr
を使用できます 繰り返されるスペースを「絞る」:
ps | grep $PPID | tr -s ' ' | cut -d' ' -f5
または、最初からしなければならなかったことに固執することもできます。 :-)