![如何逐行读取文件中的路径名,并将 Pushd 应用于每个路径名?](https://linux22.com/image/125405/%E5%A6%82%E4%BD%95%E9%80%90%E8%A1%8C%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E8%B7%AF%E5%BE%84%E5%90%8D%EF%BC%8C%E5%B9%B6%E5%B0%86%20Pushd%20%E5%BA%94%E7%94%A8%E4%BA%8E%E6%AF%8F%E4%B8%AA%E8%B7%AF%E5%BE%84%E5%90%8D%EF%BC%9F%20.png)
我有一个文件/tmp/pathnames
,其中每一行都是目录的路径名。
/tmp/my dir1
/tmp/dir2
/tmp/dir3
我想将该命令pushd
应用于文件中的每一行,以便我可以在当前 shell 的目录堆栈中包含这些路径名。
这是用于此目的的 bash 脚本:
#! /bin/bash
cat /tmp/pathnames | while read pathname; do
pushd "$pathname"
done
但它并没有像我预期的那样工作,即没有为我当前的 shell 创建目录堆栈。
即使我直接在 shell 中运行脚本中的命令source
,仍然不起作用。
我想知道为什么以及如何解决这个问题?
谢谢。
答案1
这本质上是同一个问题为什么while循环后数组为空?即(无论您source
是否愿意),它pushd
发生在不同的子 shell 中。
对比
$ 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 ~
$