![스크립트를 가져온 후에는 별칭을 유지할 수 없습니다.](https://linux55.com/image/67748/%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EA%B0%80%EC%A0%B8%EC%98%A8%20%ED%9B%84%EC%97%90%EB%8A%94%20%EB%B3%84%EC%B9%AD%EC%9D%84%20%EC%9C%A0%EC%A7%80%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
이것은 내 스크립트입니다.
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