![为什么这个不起作用:〜$ echo“trythis”| sh ./script.sh](https://linux22.com/image/1012808/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%99%E4%B8%AA%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%9A%E3%80%9C%24%20echo%E2%80%9Ctrythis%E2%80%9D%7C%20sh%20.%2Fscript.sh.png)
我尝试将字符串输入trythis
到我编写的脚本中,该脚本使用后面的内容创建一个目录。例如,此方法有效:
~$ sh ./script trythis
但使用管道则不行。我对脚本还很陌生,因此仍在掌握各种概念。
答案1
因为管道和位置参数是不同的东西
管道将管道中最右侧命令的标准输入流连接到最左侧命令的标准输出。效果就像一个命令成为另一个命令的键盘输入一样。
相比之下,位置参数如下
myscript.sh trythis
创建一个值数组,其中 myscript 和 trythis 是该数组中的项,并且根本没有与 stdin 流的连接
在这种情况下你应该做的是使用xargs
echo trythis | xargs myscript
该xargs
命令将运行添加到前面的myscript
命令,就像手动完成一样。trythis
换句话说,正是因为 sh ./script trythis
期望trythis
在位置参数列表中,所以你看不到echo trythis | sh ./myscript
它起作用。如果你echo try this | sh ./myscript trythis
这样做了,它就会起作用,因为现在你有了位置参数列表,而 echo 在技术上就变得多余了。
当然,应用程序可以自行决定如何处理 stdin 或位置参数。诸如 之类的命令echo
不关心 stdin,而只关心位置参数,而 则cat
关心两者。如果您要构建一个脚本,使其读取 stdin 并接受位置参数,那么它也可以工作,例如grep
并tail
执行此操作。而正是在我们想要动态创建位置参数或应用程序忽略 stdin 的情况下 - 正是使用 的正确地方xargs
。