【问题标题】:How to run a Linux shell command from a different directory without getting there?如何从不同的目录运行 Linux shell 命令而不到达那里?
【发布时间】:2014-11-15 11:44:05
【问题描述】:

如何从不同的目录运行 Linux shell 命令而不实际到达那里?

在下面,我想运行make 命令,但不进入源代码目录,即从我的主目录:

me@mypc:~$ ~/my/source/code/directory/make  #This is wrong!

我看过一些例子,建议如下:

me@mypc:~$ cd ~/my/source/code/directory; make

但这最终把我带到了那个我想避免的源代码目录。

可能还有其他选择:

me@mypc:~$ cd ~/my/source/code/directory; make; cd ~

但它变得复杂。

我想知道是否有比这些更好更简单的方法?

【问题讨论】:

标签: linux bash shell


【解决方案1】:

你可以试试:

me@mypc:~$ (cd ~/my/source/code/directory; make)

括号告诉你的shell生成一个单独的子shell,它有自己的当前目录,并在那个子shell中运行命令。命令完成后,子 shell 关闭,你回到你的主 shell,它的当前目录从未改变。

【讨论】:

    【解决方案2】:

    在子shell中执行,例如

    (cd ~/my/source/code/directory; make)
    

    或者,您可以使用 make 的 -C 选项,例如

    make -C ~/my/source/code/directory
    

    【讨论】:

    • 注意make -C 是不可移植的,因为make 实现不需要(POSIX)来支持它,另一方面(cd ...;make) 绝对是可移植的
    • 脚本的可移植性更受关注,脚本的编写者不一定是脚本的用户。对于交互式使用,使用对您所在的任何系统更方便的任何技术都是一件简单的事情。
    【解决方案3】:

    你也可以使用

    pushd ~/my/source/code/directory; make; popd
    

    current=`pwd`; cd ~/my/source/code/directory; make; cd "$current"
    

    【讨论】:

      【解决方案4】:
      $ (cd directory && make)
      

      您需要使用&& 而不是;。考虑类似

      cd junk && rm -rf *
      

      使用&&,如果目录junk 不存在,bash 将中止。如果您尝试cd junk; rm -rf * 并且junk 不存在,您将删除当前目录中的所有内容:(

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-06
        • 1970-01-01
        • 1970-01-01
        • 2015-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多