【问题标题】:How to enter text at command prompt from shell script without executing command?如何在不执行命令的情况下从 shell 脚本在命令提示符处输入文本?
【发布时间】:2015-10-23 04:14:35
【问题描述】:

有没有办法在命令提示符发出命令时让 shell 脚本输出文本?

上下文: 我每天通过 SSH 连接到一台特定的机器几次,大约 80% 的时间,我一登录就输入相同的三个命令。我只想将这些命令放在我的.bashrc 中,但在 20% 的情况下,我确实想要发出这些命令。我想知道是否可以在.bashrc 中输入一些命令,它会自动在我的命令行中输入一个字符串,这样当我登录时我会看到:

$ cd some/dir && ./some_script.sh

然后我可以在 80% 的时间里按回车键,或者在另外 20% 的时间里只清除文本。

【问题讨论】:

  • 您是否需要登录才能输入命令?来自本地计算机的ssh user@somehost "cd some/dir && ./some_script.sh" 也能正常工作吗?
  • 这是个好主意,但是,我通常也想实际登录机器。
  • 我会使用expect,但这只是我。
  • 不管怎样,zsh 中的print 命令可以做到这一点:print -z 'cd some/dir && ./some_script.sh'。我认为没有办法执行任意的readline 命令(相关的是start-kbd-macroend-kbd-macrocall-last-kbd-macro)。

标签: linux bash shell


【解决方案1】:

(灵感来自Abdul Rehman's 答案。)

把它放在你的.bashrc文件中的最后行:

read -e -p "(Control-C to cancel) $ " -i "cd some/dir && ./some_script.sh" && eval "$REPLY"
  • read -e 允许您使用 Readline 输入字符串进行编辑。
  • -p 为这个一次性命令提供了一个伪提示。
  • -i 提供了一个默认字符串,您可以对其进行编辑或按 Enter 接受。

如果您按 Enter,read 将设置 REPLY 的值并以状态 0 退出,从而导致执行以下 eval。 (通常,eval 不是一个好用的命令;但是,无论如何,在这里你会看到一个交互式 shell,所以这里没有太大的风险。)如果你输入 Control- C 相反,read 以状态 1 退出,并且不执行以下 eval,将您留在命令提示符处。

【讨论】:

  • 支持所有答案,特别是 @shanmuga 的单字符别名。但是,这个答案最接近我最初要求的答案,因为一次击键允许我在登录时立即运行命令或取消。
【解决方案2】:

我知道这不是你问的,但为什么不使用alias 来缩短你的命令?

$ alias a='cd some/dir && ./some_script.sh'

由于您将经常使用它,您可以将它添加到您的 .bashrc 文件中,这样您就不必每次都设置别名。
登录后输入a

$ a

【讨论】:

  • 并将第一行放入.bashrc。登录后您只需要输入a(然后回车)。
【解决方案3】:

我不知道有什么方法可以做到这一点,但您可以在您登录时使用 history -s 将该命令/那些命令推送到历史记录中,然后您就可以使用 @987654322 @ 或 <up><cr> 执行它们,如果不执行则正常进行。

history -s cd some/dir '&&' ./some_script.sh

您需要引用 shell 通常会评估/扩展/删除的任何内容。所以那个例子中的&&,任何引号,任何分号等等。

【讨论】:

  • 这很好用,对我来说是一个很大的改进(尤其是因为我想输入的真正命令更复杂)。 +1 但暂时不要选中,因为我很想知道是否有办法实现我最初的想法。
  • 我想你可能的意思是有人可以点击<esc>k<cr> 来运行命令,因为谁会使用emacs模式? ;)
  • @dannysauer 意识到 shell 没有有意义的“正常模式”的人,因为您没有编辑文档并且通常不需要移动很远。 =)
  • 我以前也是这么想的,但现在我不能忍受必须按两次以上的箭头键。 :) 永远不要切换到 vi 模式;不可能回去了。
  • @dannysauer 为什么在 emacs 模式下还是要使用箭头键?修改后的跳跃键非常更有用。 ctrl-p 向上,alt-b/alt-f 用于跳字等。
【解决方案4】:

将此脚本放入 .bashrc 中。它会要求你运行这个命令。

while true; do
read -p "Run this command?" yn
case $yn in
    [Yy]* ) cd some/dir && ./some_script.sh; break;;
    [Nn]* ) break;;
    * ) echo "Enter Yes or No."
esac
done

【讨论】:

    【解决方案5】:

    您可以在远程服务器上运行脚本,而不是通过 ssh 登录:

    ssh <SERVER> some/dir/some_script.sh
    

    剩下的 20% 你可以照常连接 ssh。

    【讨论】:

      猜你喜欢
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      相关资源
      最近更新 更多