파일의 경로 이름을 한 줄씩 읽고 각 경로 이름에 Pushd를 적용하려면 어떻게 해야 합니까? [복사]

파일의 경로 이름을 한 줄씩 읽고 각 경로 이름에 Pushd를 적용하려면 어떻게 해야 합니까? [복사]

/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  ~
$

관련 정보