我有两个脚本:
test_input.sh
是通过 SSH 执行的脚本。在此脚本中,我要求用户输入一些内容。test_ssh_connection.sh
是一个连接localhost
并执行脚本的脚本test_input.sh
在test_ssh_connection.sh
我想将输出重定向test_input.sh
到文件,但在test_input.sh
我想在屏幕上显示输入提示,因为我希望能够看到该提示。
这是我的test_ssh_connection.sh
:
echo "Connecting to localhost and executing an input script."
ssh "localhost" "sh test_input.sh" >> "test.txt"
这是test_input.sh
:
echo -n "Give me a value: "
read value
echo "You gave me [${value}]."
test.txt
其实执行后的内容是这样的test_ssh_connection.sh
:
Give me a value: You gave me [asd].
目前,提示符Give me a value:
仅在终端中test.txt
,而不在终端中。相反,我想要的是将其显示在终端中,如果可能的话,我想将其从test.txt
.
我找到了这问题,但似乎如果通过 ssh >/dev/tty
/调用下标>$(tty)
不起作用。
答案1
正是由于这个原因,不属于应用程序普通输出一部分的提示和其他交互式消息通常被写入标准错误流。例如,主提示符被写入 shell 的标准错误流。
当给出以下命令时,实用read
程序bash
将显示标准错误提示-p
:
#!/bin/bash
read -r -p 'Give me a value: ' value
printf 'You gave me [%s].\n' "$value"
和/bin/sh
你一起做类似的事情
#!/bin/sh
printf 'Give me a value: ' >&2
read -r value
printf 'You gave me [%s].\n' "$value"
重定向>&2
会将 的输出重定向printf
到标准错误。
有关的:
你想写吗直接至 TTY,然后使用这两个变体中的第二个,并使用 重定向提示消息>/dev/tty
。请注意,您必须使用ssh -t
分配伪 TTY 才能使其工作。另请注意,如果您这样做,则不使用标准错误进行提示,从而打破了相当常见的习惯。