これは私のスクリプトです。
echo "Defining aliases"
echo $$
echo "
s=screen
v=vlock -a
j=jobs
" | sed '/^$/d' | while read alias
do
echo $$
alias "$alias"
alias | wc -l
done
出力は次のとおりです。
parthian@computer$ . aliases
Defining aliases
3744
3744
4
3744
5
3744
6
parthian@computer$ ps -p $$
PID TTY TIME CMD
3744 pts/1 00:00:03 bash
parthian@computer$ alias | wc -l
3
混乱しています。これは私が書いたコードの中で最も簡単なものの1つですが、期待どおりには行われません。
編集する:echo $$
エコーラインを()に変更すると、echo $$ $BASHPID
2番目のPIDは$BASHPID
ループ内で異なり$$
ますが、常に同じままです。これが問題になる可能性がありますか?
ベストアンサー1
コンピュータが言うすべてを信じないでください。
$ ps -p $$
PID TTY TIME CMD
3744 pts/1 00:00:03 bash
$ ps -t pts/1
PID TTY TIME CMD
3744 pts/1 00:00:03 bash
4285 pts/1 00:00:00 ps
$ echo foo | while read x
do
ps -t pts/1
done
PID TTY TIME CMD
3744 pts/1 00:00:03 bash
4287 pts/1 00:00:00 bash
4288 pts/1 00:00:00 ps
$ echo "$$, $BASHPID"
3744, 3744
$ echo foo | while read x
do
echo "$$, $BASHPID"
ps -t pts/1
done
3744, 4292
PID TTY TIME CMD
3744 pts/1 00:00:03 bash
4292 pts/1 00:00:00 bash
4293 pts/1 00:00:00 ps
これにより、some_command | while …
シェルはwhile
ループをサブシェルに入れますが、引き続き基本$$
(親)プロセスのPIDを報告します。 Bashでは、$BASHPID
真実が明らかになります。
することを考える
while read alias
do
alias "$alias"
done << EOF
s=screen
v=vlock -a
j=jobs
EOF