我正在使用 udiskie 自动挂载脚本。我想要的是,插入外部驱动器后,会在安装文件夹位置打开一个新的 rxvt 终端。
一切正常,唯一的问题是:如果我启动 rxvt-terminal 并选择-cd
更改到目录,它会以某种方式阻止我卸载驱动器,即使在我 cd 到另一个目录之后也是如此。如果我手动启动终端而不使用-cd
cd 到挂载目录,则一旦更改到另一个目录,我就可以卸载;这就是我想要的。所以我的想法是使用 启动 rxvt-hold
并-e
选择通过该选项执行该cd
命令。
但是,我无法让它发挥作用; rxvt 总是告诉我“无法执行子进程”之类的。在我的脚本中,我尝试了所有类似的操作rxvt-unicode -hold -e "/bin/bash -c cd $@"
(脚本从 udiskie 获取安装路径作为参数,这有效),并在我能想到的所有组合中使用引号。即使rxvt-unicode -hold -e "/bin/bash -c cd /etc"
失败了,所以我认为这里出了问题。
答案1
一切正常
相反,你的这两种方法都不会起作用。 ☺
-cd
在分叉子进程之前,可以更改urxvt
父进程中的目录,该进程将成为伪终端主端的终端模拟器。卸载时遇到问题的原因是终端仿真器进程保留该目录作为其工作目录。
(请注意,这不是 Unicode rvxt 的客户端-服务器版本所表现出的问题urxvtc
。)
传统的 Unix shell 不存在从选项执行命令-c
然后进入从标准输入读取的交互模式的模式。这不是 Microsoft/IBM 的cmd
选项/k
。 ☺ 你得到任何一个从标准输入执行,无需命令或者执行命令但不从标准输入执行;不是都。
您不知不觉地接近了一种可以通过尝试执行的方法,cd
就好像它不是内置的 shell 一样。 (无法执行子进程的问题是,您尝试运行的程序名称是单个字符串/bin/bash -c cd /etc
,几乎可以肯定不是系统上程序映像文件的名称。)
事实上,有是独立的二进制文件,其唯一的实际工作是更改工作目录,然后链接加载到另一个程序,在本例中该程序是一个交互式 shell。我的 nosh 工具包和 Laurent Bercot 的 execline 工具包中的工具甚至被命名为chdir
和cd
。韦恩·马歇尔的工具被命名为runtool
。
urxvt -e chdir "$@" "$SHELL"
urxvt -e cd "$@" "$SHELL"
urxvt -e runtool -c "$@" "$SHELL"
另一种无法完全满足您需求的剩余方法是使用ENV
环境变量。不幸的是,要利用它,您需要交互式 shell 处于 POSIX 兼容模式,这很可能不是您想要的那种交互式 shell;以及一个临时脚本文件,其中包含所需的所有创建、安全和清理技巧。
进一步阅读
- 乔纳森·德博因·波拉德 (2016)。
chdir
。 小吃指南。软件。 cd
。洛朗·贝尔科特. 执行。 skarnet.org。- 韦恩·马歇尔(2013)。
runtool
。犯人手册。 §8。 - https://unix.stackexchange.com/a/250708/5132