![ファイルのパス名を1行ずつ読み、各パス名にPushdを適用するにはどうすればよいですか? [コピー]](https://linux33.com/image/125405/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%91%E3%82%B9%E5%90%8D%E3%82%921%E8%A1%8C%E3%81%9A%E3%81%A4%E8%AA%AD%E3%81%BF%E3%80%81%E5%90%84%E3%83%91%E3%82%B9%E5%90%8D%E3%81%ABPushd%E3%82%92%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
/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 ~
$