有一个 .desktop 编译脚本,需要在终止后保持打开状态,以防出现需要纠正的错误。在 Windows 中,我会运行cmd /k script.bat
, /k 会在终止后保持 cmd 窗口打开。
在 Linux 中,我的解决方案是创建一个 bash 脚本,其中包含“compile”命令和末尾的“bash”命令。 .desktop 文件调用脚本,由于 bash 命令,该脚本在完成后又保持打开状态。
有没有办法用单个文件来做到这一点?如果是这样,我需要使用单个命令执行以下操作之一,例如通过 bash 的命令行参数:
让 bash 在启动之前运行一个命令(相当于 Windows 中的 cmd /k 命令)
让bash在某个目录中启动(我可以配置编译在其目录打开时触发)
执行命令后使 .desktop 文件保持打开状态(这是最不可取的,因为我需要打开第二个窗口来纠正错误(如果有))
请告诉我其中之一是否可行。
答案1
我找到了一个方法。我从一些 stackexchange 网站上获取了它,但找不到它。
无论如何:你可以滥用 bash 的--init-file
选项。它旨在使用其他启动脚本而不是 .bashrc 进行覆盖,但您可以在其中放置任何内容。结合匿名管道,您可以执行以下操作:
bash --init-file <(echo "your --command --here")
命令结束后,您将返回 bash - 不是像其他解决方案那样的 bash 的新实例,而是同一个实例。
现在,这当然会跳过 .bashrc,因为这就是目的--init-file
。为了解决这个问题,你会得到非常漂亮的
bash --init-file <(echo ". \"$HOME/.bashrc\"; your --command --here")
丑陋,但它有效:-)
在适用于 Linux 的 Windows 子系统上
最后,我尝试在 Windows 上执行此操作,但遇到了麻烦,因为当您开始 bash
要调用 Linux 的 Windows 子系统,您仍然在 Windows 环境中,因此匿名管道将无法工作,$HOME 都是错误的,等等。我的“cmd /k,但用于启动 Linux 的 Windows 子系统”的解决方法已变为:
bash -c 'exec bash --init-file ^<(echo ". \"$HOME/.bashrc\"; your --command --here")'
请注意^
转义<
字符。这将启动 bash ( bash -c
),立即用一个新的 bash 进程 ( exec
) 替换当前的 bash 进程,该进程也是一个 bash 进程,现在如之前所讨论的那样从 Linux 内部进行初始化。
我制作了一个在我的 PATH 中调用的批处理文件bash-k.cmd
,这样我就可以轻松调用它,其中包含以下内容:
@bash -c 'exec bash --init-file ^<(echo ". \"$HOME/.bashrc\"; %*")'
它让我能够做bash-k cowsay hello
并且事情会成功
答案2
谢谢@skrebbel,这是一个非常有用的命令,这里是 .reg 文件代码,用于添加Bash Console Here
右键单击上下文菜单(如果您有)Linux 的 Windows 子系统
添加上下文.reg:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\Background\shell\BashConsoleHere]
@="Bash Console Here"
"Icon"=hex(2):25,00,4c,00,4f,00,43,00,41,00,4c,00,41,00,50,00,50,00,44,00,41,\
00,54,00,41,00,25,00,5c,00,6c,00,78,00,73,00,73,00,5c,00,62,00,61,00,73,00,\
68,00,2e,00,69,00,63,00,6f,00,00,00
[HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\Background\shell\BashConsoleHere\command]
@="bash -c 'exec bash --init-file <(echo \". \"$HOME/.bashrc\"\")'"
[HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\shell\BashConsoleHere]
@="Bash Console Here"
"Icon"=hex(2):25,00,4c,00,4f,00,43,00,41,00,4c,00,41,00,50,00,50,00,44,00,41,\
00,54,00,41,00,25,00,5c,00,6c,00,78,00,73,00,73,00,5c,00,62,00,61,00,73,00,\
68,00,2e,00,69,00,63,00,6f,00,00,00
[HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\shell\BashConsoleHere\command]
@="bash -c 'exec bash --init-file <(echo \". \"$HOME/.bashrc\"\")'"
[HKEY_CLASSES_ROOT\Drive\shell\BashConsoleHere]
@="Bash Console Here"
"Extended"=""
"NoWorkingDirectory"=""
[HKEY_CLASSES_ROOT\Drive\shell\BashConsoleHere\command]
@="bash -c 'exec bash --init-file <(echo \". \"$HOME/.bashrc\"\")'"
撤消.reg:
Windows Registry Editor Version 5.00
[-HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\Background\shell\BashConsoleHere]
@="Bash Console Here"
"Icon"=hex(2):25,00,4c,00,4f,00,43,00,41,00,4c,00,41,00,50,00,50,00,44,00,41,\
00,54,00,41,00,25,00,5c,00,6c,00,78,00,73,00,73,00,5c,00,62,00,61,00,73,00,\
68,00,2e,00,69,00,63,00,6f,00,00,00
[-HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\Background\shell\BashConsoleHere\command]
@="nircmd elevate cmd /c cd \"%V\" && bash.exe"
[-HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\shell\BashConsoleHere]
@="Bash Console Here"
"Icon"=hex(2):25,00,4c,00,4f,00,43,00,41,00,4c,00,41,00,50,00,50,00,44,00,41,\
00,54,00,41,00,25,00,5c,00,6c,00,78,00,73,00,73,00,5c,00,62,00,61,00,73,00,\
68,00,2e,00,69,00,63,00,6f,00,00,00
[-HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\shell\BashConsoleHere\command]
@="nircmd elevate cmd /c cd \"%1\" && bash.exe"
[-HKEY_CLASSES_ROOT\Drive\shell\BashConsoleHere]
@="Bash Console Here"
"Extended"=""
"NoWorkingDirectory"=""
[-HKEY_CLASSES_ROOT\Drive\shell\BashConsoleHere\command]
@="nircmd elevate cmd /c cd \"%1\" && bash.exe"