我有一个文件/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 ~
$