我正在玩 udiskie 自动挂载脚本。我想要的是插入外部驱动器后,在挂载文件夹位置打开一个新的 rxvt 终端。
一切正常,唯一的问题是:如果我启动 rxvt 终端并-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"
失败了,所以我认为这里出了点问题。
相反,您的任何一种方法都行不通。☺
在分叉子进程之前,在父进程中更改目录的
-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
andcd
. Wayne Marshall 的工具名为runtool
.另一种无法完全满足您需求的方法是使用
ENV
环境变量。不幸的是,要利用它,您需要交互式 shell 处于 POSIX 兼容模式,这很可能不是您想要的那种交互式 shell;以及一个临时脚本文件,其中包含所有的创建、安全和清理恶作剧。进一步阅读
chdir
. 小吃指南。软件。cd
. 劳伦特·伯科特。 执行线。skarnet.org。runtool
. perp手册。§8。