单个命令如何在一个程序中使用标准输入而在其他程序中使用文件名

how can a single command take stdin in one program and filename in other

我想做的是将参数传递给第二个程序,它采用 cmdline-args 并使用 sudo 打开,但与我传递给 sudo 的标准输入没有任何关系。

下面是一个例子来理解我正在尝试做的事情。

echo "mypass" | sudo -S nvim "filename"

这里 sudo 必须采用 stdin,nvim 必须采用来自 cmdline-arg 的文件名。但是 nvim 打开一个未命名的文件并将 stdin 放入该文件,甚至不关心我传递给它的参数。

我的最终目标不仅是在不输入密码的情况下打开文件,而且了解如何以我想要的方式传递参数

有可能吗?

正如你所拥有的那样,它似乎应该有效。
也许可以明确地尝试 bash 调用。即使您需要单独的输入重定向,它也能正常工作。

$ echo "$pw"|sudo -S bash -c "head -3 < foo"
0
1
2

如果您需要传递文件参数,可以在别处显式绑定您的标准输入。

$ echo "$pw"|sudo -S bash -c "head -5 foo </dev/null"
0
1
2

由于 the sudo 不需要为两个连续的 sudo 命令重复密码,我应该发出两个连续的命令:

echo "mypass" | sudo -S -v 
sudo nvim "filename"         # will not prompt for password this time

解释:sudo -v 只是更新 sudo 的凭据,而不执行任何命令。

只需将文件名作为脚本的第一个参数传递:

echo "<your password>" | sudo -S nvim ""

并调用脚本:

./script.sh myfile.txt

请注意,sudo-S 选项的行为有所不同,具体取决于凭据是否已缓存。最好还使用 -k 选项使凭据无效:

echo "<your password>" | sudo -k -S nvim ""