이것은 내 스크립트입니다.
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
혼란스러워요. 이것은 내가 작성한 코드 중 가장 간단한 것 중 하나이지만, 예상한 대로 수행되지 않습니다.
편집하다:echo $$
에코 라인을 ( ) 로 변경하면 echo $$ $BASHPID
두 번째 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