如何使用Bash脚本“设置”屏幕

4

我正在尝试编写一个Bash脚本,用于创建一个特定窗口集合的Screen软件会话,并在每个窗口中cd到特定目录。

以下是我目前拥有的脚本:

#!/bin/bash

killall screen;
screen -AmdS work;
screen -S work bash -c "cd myDir";

问题在于我似乎无法在该会话中更改目录。运行此脚本后,我运行$ screen -r,当前目录仍然是我的默认目录(~/)。
(我尝试将cd命令更改为touch myFile,运行脚本后文件已经存在)

2
如果您在终端中尝试 bash -c "cd myDir",您会发现它不会更改目录。使用屏幕命令(而不是 shell 命令)chdir 来更改目录,然后打开一个新的 shell,它将在该目录中启动。 - that other guy
1
好的——它会更改目录,但它更改的是您使用“bash”命令启动的新shell的目录,而不是运行它的shell/程序的目录。由于该新shell在完成使用bash -c传递的脚本运行后立即退出... - Charles Duffy
2个回答

8
尝试以下操作,它将打开一个新的屏幕会话,并在其中运行bash命令,该命令将更改目录并打开一个以此目录为当前目录的新bash:
screen -S work bash -c 'cd myDir && exec bash'

添加-d -m以在分离模式下运行。重新附加后,您将位于myDir中:

screen -S work -d -m bash -c 'cd myDir && exec bash'

更好的解决方案

以下代码将创建一个分离的屏幕,每个屏幕都在myDir1/2/3目录下运行myCommand1/2/3

cd myDir1
screen -S work -d -m
screen -S work -X exec myCommand1
screen -S work -X chdir myDir2
screen -S work -X screen
screen -S work -X exec myCommand2
screen -S work -X chdir myDir3
screen -S work -X screen
screen -S work -X exec myCommand3
cd -

请注意最后的cd -,它将把您返回到原始工作目录。
最后,只需使用screen -r work来连接正在运行的屏幕会话。

1
cd mydir && exec bash 避免让父进程停留在内存中。 - Charles Duffy
@CharlesDuffy 更好了,谢谢..我会用exec更新答案。 - martin.macko.47

2

您可以将要运行的命令行(包括最后的换行符)保存到寄存器中,并将其粘贴到屏幕输入中:

screen -S work -X register c $'cd myDir\n'
screen -S work -X paste c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接