在与 fish 中当前目录不同的目录中执行子命令?
execute a subcommand in a different directory as the current one in fish?
我想从与当前目录不同的目录移动文件。这是我想到的解决方案:
mv (cd ~/Downloads; ls -t | head -1 | xargs -I {} readlink -f {}) ./
可能有更好的方法,但一路上我发现我对保留在子命令中的目录更改的期望是错误的:运行 cd 更改 mv
所在的目录已执行。
那么,有没有办法只改变当前子命令的目录,而不影响 top 命令?
是的,我们中的许多人来自 Posix shell,例如 bash
或 zsh
习惯于能够 运行 命令替换,例如这使用 $()
或只是反引号并保持父 shell 环境不变。这是一个很好的技巧,恕我直言。
另一方面,fish
在使用其命令替换运算符 ()
时不会自动创建子 shell。为此有一个 feature request here,但解决方法(如那里所建议的那样)相当简单——只需在命令替换中显式创建一个 subshell 即可。例如:
mv (fish -c 'cd ~/Downloads; ls -t | head -1 | xargs -I {} readlink -f {}') ./
缺点是语法 highlighting/checking 在引用的文本中不起作用,并且 quoting/escaping 规则变得更加复杂。
我想从与当前目录不同的目录移动文件。这是我想到的解决方案:
mv (cd ~/Downloads; ls -t | head -1 | xargs -I {} readlink -f {}) ./
可能有更好的方法,但一路上我发现我对保留在子命令中的目录更改的期望是错误的:运行 cd 更改 mv
所在的目录已执行。
那么,有没有办法只改变当前子命令的目录,而不影响 top 命令?
是的,我们中的许多人来自 Posix shell,例如 bash
或 zsh
习惯于能够 运行 命令替换,例如这使用 $()
或只是反引号并保持父 shell 环境不变。这是一个很好的技巧,恕我直言。
另一方面,fish
在使用其命令替换运算符 ()
时不会自动创建子 shell。为此有一个 feature request here,但解决方法(如那里所建议的那样)相当简单——只需在命令替换中显式创建一个 subshell 即可。例如:
mv (fish -c 'cd ~/Downloads; ls -t | head -1 | xargs -I {} readlink -f {}') ./
缺点是语法 highlighting/checking 在引用的文本中不起作用,并且 quoting/escaping 规则变得更加复杂。