我想运行 make、make install、python setup install 等命令而不更改目录

我想运行 make、make install、python setup install 等命令而不更改目录

我编写了一个脚本,它将从互联网下载软件到当前用户的主目录,然后解压它。然后我必须在某些软件中运行make它。make installpython setup.py install

问题是我不想更改当前目录来运行所有这些命令。

有没有办法在命令中指定路径,例如:

python /home/username/Desktop/urllib/setup.py install
make /home/username/Desktop/somedir/
make install /home/username/Desktop/somedir/

答案1

shell是一个组合命令的工具。当然,您已经知道cd更改到不同目录的命令,因此您缺少一些将其与另一个命令结合在一起的粘合剂。

您可以运行cd /some/dir && python foo.py以更改到不同的目录并一次性运行命令。cd /some/dir; python foo.py也会起作用;使用双与号而不是分号的优点是,如果失败(例如,因为您输错了目录名称),则不会执行&&该命令。您可以通过这种方式链接更多命令,例如.pythoncdcd /some/dir && python foo.py && make && make install

如果您事先知道要在不同目录中运行哪些命令,则可以cd在一个目录中运行这些命令和其他命令子外壳:如果您在括号中编写命令,它们将在一个单独的 shell 进程中执行,该进程继承现有进程的所有状态(环境、当前目录等)。一旦子 shell 终止(在右括号处),原始 shell 就会恢复,不受子 shell 内任何更改的影响。

(cd /some/dir && python foo.py && make && make install)
# back in the original directory

如果您事先不知道要运行哪些命令,可以运行cd,然后运行其他命令,然后使用 返回到上一个目录cd -

cd /some/dir
python foo.py
make
make install
cd -
# back in the original directory

除非您使用 zsh 作为 shell,否则只能使用 .back 返回一次cd -。如果您希望能够进一步返回,请使用命令pushdpopdpushd /some/dir与 类似cd /some/dir,但它另外将前一个目录添加到堆栈顶部。popd更改回保存在堆栈顶部的目录,并从堆栈中删除该目录。您可以使用 来查看堆叠目录的列表,并使用、 等dirs导航到堆叠上的任何目录pushd -1pushd -2

pushd /some/dir
python foo.py
make
make install
popd
# back in the original directory

一些命令可以选择告诉它们在不同的目录中工作。例如,make -C /some/dir相当于(cd /some/dir && make).这主要是一种打字快捷方式,或者在无法直接使用 shell 时很方便;一般来说,你总是可以cd在 shell 中使用。

答案2

因为make您可以使用该-C选项。或者使用pushdshell 命令移动到适当的目录,然后popd在所需的命令完成后。

答案3

您可以使用 subshel​​l 来实现这一点。像这样:

 $ pwd ; ( cd /tmp ; pwd ; ) ; pwd
/home/user
/tmp
/home/user

相关内容