Ale*_*lex 5 linux bash .desktop
有一个 .desktop 编译脚本,需要在终止后保持打开状态,以防出现错误需要更正。在 Windows 中,我会运行cmd /k script.bat,并且 /k 会在终止后保持一个 cmd 窗口打开。
在 Linux 中,我的解决方案是创建一个 bash 脚本,它由“compile”命令和最后的“bash”命令组成。.desktop 文件调用脚本,由于 bash 命令,脚本在完成后保持打开状态。
有没有办法用单个文件来做到这一点?如果是这样,我需要使用单个命令执行以下任一操作,例如通过 bash 的命令行参数:
让 bash 在启动前运行一个命令(相当于 Windows 中的 cmd /k 命令)
使 bash 在某个目录下启动(我可以将编译配置为在其目录打开时触发)
在执行其命令后使 .desktop 文件保持打开状态(这是最不可取的,因为我需要打开第二个窗口来纠正错误,如果有的话)
请让我知道其中之一是否可行。
小智 9
我找到了一个方法。我从一些 stackexchange 网站上获取了它,但找不到它。
无论如何:你可以滥用 bash 的--init-file选项。它旨在使用其他启动脚本而不是 .bashrc 进行覆盖,但您可以在其中放置任何内容。结合匿名管道,您可以执行以下操作:
bash --init-file <(echo "your --command --here")
Run Code Online (Sandbox Code Playgroud)
命令结束后,您将返回 bash - 不是像其他解决方案那样的 bash 的新实例,而是同一个实例。
现在,这当然会跳过 .bashrc,因为这就是目的--init-file。为了解决这个问题,你会得到非常漂亮的
bash --init-file <(echo ". \"$HOME/.bashrc\"; your --command --here")
Run Code Online (Sandbox Code Playgroud)
丑陋,但它有效:-)
在适用于 Linux 的 Windows 子系统上
最后,我尝试在 Windows 上执行此操作,但遇到了麻烦,因为当您开始 bash调用 Linux 的 Windows 子系统时,您仍然处于 Windows 环境中,因此匿名管道将无法工作,$HOME 都是错误的,等等。我的“cmd /k,但用于启动 Linux 的 Windows 子系统”的解决方法已变为:
bash -c 'exec bash --init-file ^<(echo ". \"$HOME/.bashrc\"; your --command --here")'
Run Code Online (Sandbox Code Playgroud)
请注意^转义<字符。这将启动 bash ( bash -c),立即用一个新的 ( exec) 替换当前的 bash 进程,该进程也是一个 bash 进程,现在如之前所讨论的那样从 Linux 内部进行初始化。
我制作了一个在我的 PATH 中调用的批处理文件bash-k.cmd,这样我就可以轻松调用它,其中包含以下内容:
@bash -c 'exec bash --init-file ^<(echo ". \"$HOME/.bashrc\"; %*")'
Run Code Online (Sandbox Code Playgroud)
它让我能够做bash-k cowsay hello并且事情会成功