我正在练习|
管道以传递输出。
首先,我尝试basename
了
$ basename -a $(ls test_directory/*)
此行按预期工作,仅显示文件名而不显示目录名。
但是当我尝试通过管道输出ls
tobasename
$ ls test_directory/* | basename -a
错误信息在这里:
basename: missing operand
Try 'basename --help' for more information.
我发现将上一个命令的输出传递给下一个作为Unix 和 Linux上的参数,其中一个答案提到:
通过标准输入传递输入:
ls | wc -l
这将计算 ls 输出中的行数
通过命令行参数传递输入:
wc -l $(ls)
这将计算 ls 打印的文件列表中的行数
我无法理解“输出ls
”和“由”打印的文件之间的区别ls
。他们不是一样的吗?我想了解其中的区别。
我想了解为什么ls td/* | basename -a
不起作用。
ls | wc -l
解释和之间的区别wc -l $(ls)
。我要举个例子。1.
如帖子中所述,此命令将计算 `ls` 输出中的行数。ls | wc -l
例如,我有一个
~/Desktop/Practice/python
包含 4 个 python 脚本的目录。现在,如果我使用上面的命令,我会得到以下输出:
这意味着其
wc -l
输出ls
返回 4 个 python 脚本的计数因此计数变为 42.
再次按照帖子的建议,此命令将计算 ls 打印的文件列表中的行数。wc -l $(ls)
因为在这种情况下,您将 `ls` 作为参数传递给命令
现在,如果我在同一目录中使用上述命令,我会得到以下输出:
这表明
wc -l
这次计算了每个单独的 python 脚本中存在的行数,这些脚本由ls
.黑白命令行参数和标准输入的区别
实际的区别在于命令的来源。命令可以使用“命令行参数”或“标准输入”来获取输入。因此,如何获取特定命令的输入取决于命令的开发者。管道将一个命令的标准输出作为标准输入传递给第二个命令。因此,如果第二个命令无法处理标准输入,它将引发错误。然而,有些命令同时采用命令行参数和标准输入,如“wc”,但结果不同,因为
wc
处理标准输入和命令行参数的方式不同。在你的情况下是
basename
. 如果您阅读了 basename 的手册页:它明确规定
basename
了它的输入采用命令行参数。因此管道将不起作用。如何使管道工作
正如@bac0n 所建议的,要执行
basename
你需要使用的管道xargs
。这是因为
xargs
接受标准输入并作为“命令行参数”传递给另一个命令。我可以展示它的最简单方法:
有些命令是为了接受而构建的
stdin
。举cat
个例子。您可以将 previews 命令的输出通过管道传输到cat
:某些命令仅获取参数作为输入,例如
echo
. 如果你运行:它将通过管道输出
ls
toecho
。但echo
不会收到。要使用echo
你必须给它一些论据:如果您需要将命令的输出用作其他命令的参数(例如,在它只接受参数而不接受参数的情况下
stdin
),您有不同的选择。一种是使用命令替换:在这种情况下
ls
将运行,然后输出ls
将作为参数传递给echo
.对
basename
. 你必须传递参数。还有一些命令可以同时接受参数
stdin
。例如cat
. 如果您通过管道cat
将某些内容打印出来。然而,对于一个参数,它除了你传递一个filename
来打印它的内容。