我刚刚注意到,无论cryptsetup
转发到哪个FD,/dev/null
它仍然显示提示输入密码。例如这仍然显示提示:
cryptsetyp luksOpen /dev/sdXY name >/dev/null 2>/dev/null
如何在终端消息中显示无法使用标准重定向重定向到文件的消息?
我想在 bash 脚本中获得这样的功能,因为我使用 stdout 将结果返回到母脚本,但我仍然想显示交互式提示 - 是否可以使用 bash 这样做?
答案1
如果你strace
使用它,你可能会看到它/dev/tty
直接使用。
...
open("/dev/tty", O_RDWR) = 6
ioctl(6, TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(6, "Enter passphrase for .......: ", 30) = 30
ioctl(6, SNDCTL_TMR_CONTINUE or TCSETSF, {B38400 opost isig icanon -echo ...}) = 0
...
在源代码中(utils_crypt.c
):
static int interactive_pass(const char *prompt, char *pass, size_t maxlen,
long timeout)
{
[...]
/* Read and write to /dev/tty if available */
infd = open("/dev/tty", O_RDWR);
if (infd == -1) {
infd = STDIN_FILENO;
outfd = STDERR_FILENO;
} else
outfd = infd;
if (tcgetattr(infd, &orig))
goto out_err;
因此,它/dev/tty
通过打开它来进行测试,如果有效,它就会使用它。如果失败,它会退回到常规标准输入、标准输出,然后您将不再看到提示。
至于/dev/tty
,它是进程的终端,详细信息请参见man 4 tty
。
答案2
据推测,它直接写入/dev/tty
(无论如何,您可以获得相同的行为)
#!/bin/bash
# set up the new file descriptor
exec 3> /dev/tty
# test
echo "Stdout"
echo "Stderr" >&2
echo "Directly to tty" >&3
或者,您可以简单地执行以下操作:
echo "Directly to tty" >/dev/tty
$ ./foo.sh >/dev/null 2>/dev/null
Directly to tty
read
如果你这样做仍然有效。
exec 需要在当前 shell 的持续时间内保持重定向。
简单命令的重定向:
$ echo yes 3>file
在执行命令时持续。一旦命令(本例中为 echo)结束,shell 就会删除重定向并恢复到“当前 shell”执行环境。
A:
$ 3>file
仍然是一个“简单命令”,其中执行的命令是“无”,重定向不会持续很长时间。
而是在:
$ exec 3>file
exec 将“当前 shell”替换为包含重定向的新 shell。这使得只要“当前 shell”存在,重定向就保持活动状态。这可以通过以下方式撤消(好吧,实际上是关闭 fd 3):
$ exec 3>&-