ファイルのパス名を1行ずつ読み、各パス名にPushdを適用するにはどうすればよいですか? [コピー]

ファイルのパス名を1行ずつ読み、各パス名に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  ~
$

おすすめ記事