使用xargs cd到目录


Answers:


22

管道在子进程中运行xargs,而xargs在子进程中运行cd。子流程中的更改不会传播到父流程。


完全有道理。感谢您帮助Unix新手。
伊恩·洛汀斯基

3
您可以通过使用反引号获得所需的效果:(cd `echo "/some/directory/path" | cut -d\ -f1` 请注意,我添加了“ cut”以在空格上进行分割并以xargs的方式抓取第一项)
Slartibartfast 2010年

5
实际上,xargs它不能运行,cd因为它必须是内置的shell,xargs并且只能运行独立的可执行文件。但是,您所说的关于子流程是正确的。
暂停,直到另行通知。

/ usr / bin / cd至少在Solaris上绝对是Unix独立记录的命令。
jlliagre

对自动生成的路径使用@Slartibartfast :(cd `port file libcudd | sed -e 's/\/Portfile//'` 通常是您不想手动处理的长路径,例如MacPorts Portfile位置)。
Ioannis Filippidis

23

该命令cd是内置的,因为有关当前目录的信息与进程相关联,并且只有内置的shell才能更改正在运行的shell的当前目录。

您的代码有两个问题:

  1. xargs无法运行,cd因为cd它是内置命令,并且xargs只能运行可执行文件。
  2. 即使您cd在名为from的子流程中运行xargs,它也不会对父流程产生任何影响,如上所述。

解决方案是运行一个子外壳,在其中运行cd,然后可以在新的当前目录中执行命令。

ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'

ls | xargs ...在此示例中这样做没有任何意义。它应该传递值$0,例如echo "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
wisbucky

IMO更好的解决方案是:xargs的-L 1 -I @@的bash -c 'CD @@ && PWD && LS'
罗马中号
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.