/tmp/pathnames
각 줄이 디렉터리의 경로 이름인 파일이 있습니다 .
/tmp/my dir1
/tmp/dir2
/tmp/dir3
pushd
현재 쉘의 디렉토리 스택에서 해당 경로 이름을 가질 수 있도록 파일의 모든 행에 이 명령을 적용하고 싶습니다 .
이 목적을 위한 bash 스크립트는 다음과 같습니다.
#! /bin/bash
cat /tmp/pathnames | while read pathname; do
pushd "$pathname"
done
하지만 예상대로 작동하지 않습니다. 즉, 현재 쉘에 대해 디렉터리 스택이 생성되지 않습니다.
쉘에서 직접 스크립트의 명령을 실행해도 source
여전히 작동하지 않습니다.
이 문제의 이유와 해결 방법을 알고 싶습니다.
감사해요.
답변1
이것은 본질적으로 같은 질문입니다while 루프 후에 배열이 비어 있는 이유는 무엇입니까?즉, (좋든 source
싫든) pushd
다른 하위 쉘에서 발생합니다.
비교됨
$ cat pathnames | while read pathname; do pushd "$pathname"; dirs -v; done
/tmp/my dir1 ~
0 /tmp/my dir1
1 ~
/tmp/dir2 /tmp/my dir1 ~
0 /tmp/dir2
1 /tmp/my dir1
2 ~
/tmp/dir3 /tmp/dir2 /tmp/my dir1 ~
0 /tmp/dir3
1 /tmp/dir2
2 /tmp/my dir1
3 ~
$
$ dirs -v
0 ~
그리고
$ while read pathname; do pushd "$pathname"; dirs -v; done < pathnames
/tmp/my dir1 ~
0 /tmp/my dir1
1 ~
/tmp/dir2 /tmp/my dir1 ~
0 /tmp/dir2
1 /tmp/my dir1
2 ~
/tmp/dir3 /tmp/dir2 /tmp/my dir1 ~
0 /tmp/dir3
1 /tmp/dir2
2 /tmp/my dir1
3 ~
$
$ dirs -v
0 /tmp/dir3
1 /tmp/dir2
2 /tmp/my dir1
3 ~
$