我编写了一个脚本,它将从互联网下载软件到当前用户的主目录,然后解压它。然后我必须在某些软件中运行make
它。make install
python 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
也会起作用;使用双与号而不是分号的优点是,如果失败(例如,因为您输错了目录名称),则不会执行&&
该命令。您可以通过这种方式链接更多命令,例如.python
cd
cd /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 -
。如果您希望能够进一步返回,请使用命令pushd
和popd
。pushd /some/dir
与 类似cd /some/dir
,但它另外将前一个目录添加到堆栈顶部。popd
更改回保存在堆栈顶部的目录,并从堆栈中删除该目录。您可以使用 来查看堆叠目录的列表,并使用、 等dirs
导航到堆叠上的任何目录pushd -1
。pushd -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
选项。或者使用pushd
shell 命令移动到适当的目录,然后popd
在所需的命令完成后。
答案3
您可以使用 subshell 来实现这一点。像这样:
$ pwd ; ( cd /tmp ; pwd ; ) ; pwd
/home/user
/tmp
/home/user