子shell完成后如何留在目录中?

时间:2013-08-29 12:59:30

标签: bash shell

我正在尝试这样做(只是一个例子,而不是现实生活中的情况):

$ mkdir test; ( cd test; echo "foo" > test.txt ); cat test.txt
cat: test.txt: No such file or directory

但是,它失败了,因为子shell完成后会恢复cd test目录更改。什么是变通方法?我不能使用脚本.sh文件,一切都应该在一个命令行中。

3 个答案:

答案 0 :(得分:4)

跳过子shell并改为使用{ ... }块(或解释你的用例,因为这个例子没有多大意义):

$ find
.
$ mkdir dir; { cd dir; echo foo > test.txt; }; cat test.txt
foo
$ cd ..
$ find
.
./dir
./dir/test.txt

答案 1 :(得分:3)

为什么不呢?

mkdir test; echo "foo" > test/test.txt; cat test/test.txt

另一种方式是

mkdir test; cd "$(cd test; echo "foo" > test.txt; echo "$PWD";)"; cat test.txt

或者

mkdir test; (cd test; echo "foo" > test.txt; echo "$PWD" > /some/file); cd "$(</some/file)"; cat test.txt

答案 2 :(得分:1)

正如评论者所说,子进程无法修改父进程的工作目录。您可以从子进程返回一个值以供父级读取,然后使父级对此值执行操作。毫无意义的bash例子: -

$ mkdir test; DIR=$( cd test; echo "foo" > test.txt; echo test ); cat $DIR/test.txt