在Shell提示符下输入文本

4

在shell脚本中有没有一种方法可以通过程序来设置输入行?考虑以下场景。

假设我制作了一个创建git分支的脚本,当它完成创建分支后,我不想通过程序切换到新分支,而只是提供显示在提示符上的命令给用户,这样用户就不必键入命令以切换到新分支,只需按下回车键即可运行显示的命令。

read -p "Enter your branch name: " N
git branch $N
render-text-on-prompt "git checkout $N"

执行:

$ ./mkbranch
$ Enter your branch name: change-93
$ git checkout change-93 _

相关链接:https://unix.stackexchange.com/questions/82630/put-text-in-the-bash-command-line-buffer 和 https://superuser.com/questions/1462995/how-to-create-a-bash-function-that-return-to-the-current-prompt - melpomene
1
我通常使用 tmux paste-buffer 来完成这种任务。该脚本将命令加载到缓冲区中,然后粘贴它。用户可以随后敲击回车键,或取消(或交互式地编辑)该命令。 - William Pursell
3个回答

1

bash 没有一种“预加载”下一个输入缓冲区的方法(与 zsh 不同,在其中您可以简单地使用 print -z "git checkout $N")。您需要让 mkbranch 处理输入(并随后执行输入的命令)本身。

read -p "Enter your branch name: " N
git branch "$N"
read -e -i "git checkout $N" cmd
eval "$cmd"

-e参数告诉read使用Readline库输入文本行;-i选项预加载输入缓冲区。(没有-e-i不起作用。)

请注意,read -e本身并不知道任何关于bash语法的信息,因此没有隐式的行继续符号;这使它与普通的bash提示有着明显的不同。

另一种选择是简单地“询问”用户是否想要检出新创建的分支:

read -p "Enter your branch name: " N
git branch "$N"
read -e -i Y -p "Checkout branch $N? (Y/n)"
[[ $REPLY == Y ]] && git checkout "$N"

按下回车键接受预加载的 Y 键以触发硬编码的“结账”命令;任何其他命令都将跳过它。无论哪种方式,脚本都会结束并返回常规命令提示符。

你可以设置 READLINE_LINE,但文档中说它只在 bind -x 中起作用。 - melpomene
我不确定即使在那里分配给它是有用的;我认为这只是一种让通过 bind -x 绑定到键的代码访问当前命令行缓冲区的方式。 - chepner

0
你可以使用 switch 来检查用户输入的内容。
function render_text_on_prompt {
    if [[ -z ${1} ]]; then # The argument passed into the function is empty/not set
        echo "Wrong usage!"
        return 1
    fi

    # Print the argument
    echo "${1} - Hit the enter key to run this command or anything else to abort"

    read INPUT_STRING
    case ${INPUT_STRING} in # Check what the user entered
        "") # User entered <enter>
            ${1}
            break
            ;;
        *) # User entered anything but enter
            echo "Nothing changed"
            break
            ;;
    esac
    return 0
}

我希望这能有所帮助。


0

这是一个桩代码,可以根据需要进行调整:

c="echo foo bar" ; read -p "Run '$c' [Y/n]? " n ; \
[ ! "$n" ] || [ "$n" = Y ] || [ "$n" = y ] && $c

如果用户输入EnteryY,最后一行将运行命令$c。示例运行:

Run 'echo foo bar' [Y/n]? 

用户按下 回车键

foo bar

糟糕,这是一个POSIX shell版本...使用bash版本会更简洁。待定... - agc
“bash” 标签是由 Jonathan Leffler 添加的,而不是 OP。 - melpomene
2
@melpomene: 在“read”命令中使用“-p”使其“不符合POSIX标准”,而POSIX的“read”(命令)仅支持“-r”选项。 - Jonathan Leffler
1
@JonathanLeffler,奇怪的是,上面的代码可以在dashbash --posix中运行。啊哈,但在posh中却不行!显然,有些POSIX shell比其他的更POSIX... - agc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接