我是编写 shell 脚本的新手,我正在尝试将脚本写入 CD 到为我的一个类保存程序的文件夹,然后打开第二个终端,通过 ssh 连接到用于测试我编写的程序的服务器。问题是我找不到方法将终端 shell 的目录更改为存储程序的位置。
#!/bin/bash/
gnome-terminal -e "ssh [email protected]";
cd /path/to/dir
问题是脚本终止后工作目录不会更改(它保持调用脚本时的状态)。我尝试用“.”来调用它。在脚本名称前面,使其在当前进程中运行,但第二个终端从未打开。
我尝试做与上面相同的事情,除了将第三行替换为
gnome-terminal -e "cd /path/to/dir/";
这样两个终端就会打开,但 CD 到路径的终端会出现错误,类似于“为此终端创建子进程时出错:无法执行子进程'cd'”
谁能帮我弄清楚如何解决这个问题?
答案1
您的第一个版本首先打开一个gnome-terminal
,等到您关闭它,然后更改到新目录。
您的第二个版本尝试运行命令cd
而不是 shell,但这cd
不是真正的命令,而是 shell 内置命令。 (看看type -a cd
这一点。)
问题是如何gnome-terminal
决定显示哪个目录。除非被该选项覆盖,否则它通常会使用当前工作目录--working-directory
。
因此您可以使用:
cd /path/to/dir && gnome-terminal
或者
gnome-terminal --working-directory=/path/to/dir
查看man gnome-terminal
可用选项。
对于 ssh 部分,您必须决定是否要在本地或远程端运行 gnome 终端。要在远程站点上运行它,您可以使用:
ssh -X [email protected] gnome-terminal --working-directory=/path/to/dir
对于本地方面,您可以使用类似以下内容:
gnome-terminal -e "ssh -t [email protected] bash -c 'cd /path/to/dir && bash -l'";
答案2
如果运行脚本时在脚本名称前加一个点(空格),工作目录将保持更改。
例如,我使用一个名为 pj 的项目,它将我移动到我的 python 项目目录中。它包含这两行:
#!/bin/bash
cd /home/pi/python
我使其可执行,然后将其复制到 /usr/sbin ,它位于我的 $PATH 上。
要运行它,我输入:
. pj (note the dot and the space)
瞧,它变成了那个目录,把我留在那里。
再简单不过了。