스크립트를 가져온 후에는 별칭을 유지할 수 없습니다.

스크립트를 가져온 후에는 별칭을 유지할 수 없습니다.

이것은 내 스크립트입니다.

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

관련 정보