Linux 中的 CMD /K 相当于什么?

Linux 中的 CMD /K 相当于什么?

有一个 .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"

相关内容