如何逐行读取文件中的路径名,并将 Pushd 应用于每个路径名?

如何逐行读取文件中的路径名,并将 Pushd 应用于每个路径名?

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

相关内容