我正在尝试这样做(只是一个例子,而不是现实生活中的情况):
$ mkdir test; ( cd test; echo "foo" > test.txt ); cat test.txt
cat: test.txt: No such file or directory
但是,它失败了,因为子shell完成后会恢复cd test
目录更改。什么是变通方法?我不能使用脚本.sh
文件,一切都应该在一个命令行中。
答案 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