我希望 bash 首先执行一个命令,但是在命令完成(或Ctrl+ C'ed)后进入交互模式(最好使用历史记录中的命令,可供up)。
如何以最简单、最美丽的方式实现它?
受到 cmd.exe 的启发/K
:
$ wineconsole cmd.exe /K echo qqq
qqq
Z:\home\wine>
答案1
更清洁的版本斯科特的回答:
把这个放到
.bash_profile
:if [ ! -z "$EXECUTE_COMMAND" ]; then history -s "$EXECUTE_COMMAND" $EXECUTE_COMMAND fi
以此方式启动 bash:
$ EXECUTE_COMMAND='ping 127.0.0.1' bash -l PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_req=1 ttl=64 time=0.177 ms ... ^C 5 packets transmitted, 5 received, 0% packet loss, time 3996ms $ $ ping 127.0.0.1
答案2
我不能 100% 确定我完全理解了您的要求,并且(唉)我bash
目前无法访问带有该系统的系统,但也许以下内容会对您有所帮助。请将其放在您的末尾.bashrc
:
如果 [ -f ~/.bash_initial_command ] 然后 .~/.bash_initial_command rm ~/.bash_initial_command 菲
(其中.bash_initial_command
是任意文件名;如果需要,可以选择其他文件名),然后编写执行以下操作的脚本:
(echo“history –s'$@'”;echo“$@”)>~/.bash_initial_command
即,这会将命令(作为参数呈现给上述脚本)放置在下一个要bash
启动的交互将找到并执行它的位置。(例如,如果您运行set_up_cmd ls –l
,则下一个bash
将运行ls –l
。) history –s
将命令放入历史记录而不执行它。
笔记:我不知道这是否会起作用.bashrc
。
如果您想要使用带有引号的命令(即,带引号的特殊字符)或重定向(<
或>
),或者复合命令(即,包含;
、|
、&&
或||
),则需要进一步细化。
一个小问题:如果你使用Ctrl+C命令,这可能会终止.bashrc
处理,从而阻止.bash_initial_command
文件被删除。你可以通过以下方式处理这个问题:
如果 [ -f ~/.bash_initial_command ] 然后 mv ~/.bash_initial_command ~/.bash_initial_command.$$ 陷阱“rm -f ~/.bash_initial_command.$$” 0 .~/.bash_initial_command.$$ rm -f ~/.bash_initial_command.$$ 菲
这给出了.bash_initial_command
一个唯一的名称,以避免冲突,并安排在 shell 退出时将其删除。
如果您需要同时启动其中几个,请考虑将“tty”名称构建$(basename $(tty))
到.bash_initial_command
文件名中。
当然,这样做使得确保您的主目录除了您自己之外任何人都无法写入变得更加重要。
答案3
您可以将命令添加到您的.bash_profile
或.bashrc
。它将在您打开新窗口或登录到您的机器时立即运行。
看这关于两个文件之间差异的页面。