我在Julia REPL中运行这样的外部命令:
stream, process = open(`sudo cat file.txt`, "w", STDOUT)
命令sudo cat file.txt
,在shell中标准执行时,要求输入密码然后打印文件。
所以我将它粘贴到REPL中,按回车键立即返回,因为该过程是异步运行的。到目前为止,一切都按预期运作。
但是当我开始在REPL中输入其他内容时,我输入的字符不会出现在屏幕上(sudo
要求输入密码),因为异步过程(大概)是“窃取”我正在打字的文字。
答案 0 :(得分:1)
您对open
如何运作的理解是正确的。正如您在评论中澄清的那样,您的问题是sudo
在终端中要求输入密码而不是从stream
读取密码的原因。 Bob在https://serverfault.com/a/731943处对此进行了详细解释。引用答案的相关部分:
实际上,典型的sudo调用根本不会从stdin读取密码。相反,sudo将直接访问控制终端(tty或pty,通过/ dev / tty特殊文件)并直接输出提示和读取字符。这可以在sudo源代码中的tgetpass.c文件中看到。
sudo
能够使用-S
标志从stdin读取。如果您想自己编写密码,可以使用此方法:
否则,如果您特别请求sudo从stdin读取,例如使用-S标志 - 它还会将提示写入stderr。这就是MadHatter的答案适用的情况。