在与 Fish 中当前目录不同的目录中执行子命令?

hon*_*ami 1 shell fish subcommand

我想从与当前目录不同的目录中移动文件。这是我想到的解决方案:

mv (cd ~/Downloads; ls -t | head -1 | xargs -I {} readlink -f {}) ./

可能有更好的方法,但一路上我发现我对子命令中目录更改的期望是错误的:运行 cd 会更改正在mv执行的目录。

那么,有没有办法只改变当前子命令的目录,而不影响top命令呢?

Not*_*1ds 6

是的,我们中的许多人来自 Posix shell,喜欢bashzsh习惯于能够使用$()或仅使用反引号来运行这样的命令替换,并保持父 shell 环境不变。这是一个很好的技巧,恕我直言。

另一方面,fish在使用命令替换运算符时不会自动创建子 shell ()。这里有一个功能请求,但解决方法(如建议的那样)相当简单——只需在命令替换中显式创建一个子 shell 即可。例如:

mv (fish -c 'cd ~/Downloads; ls -t | head -1 | xargs -I {} readlink -f {}') ./
Run Code Online (Sandbox Code Playgroud)

缺点是语法突出显示/检查在引用的文本中不起作用,并且引用/转义规则变得更加复杂。