我对" head"中的奇怪行为感到困惑。访问函数参数时的命令。 这是代码:
function fun1 { echo $1; head $1; }
以下是2个不同函数调用的输出
echo "asasa" | fun1
--- output start ---
asasa
--- end ---
并且在传递参数时:
echo "asasa" | fun1 "var1"
--- output start ---
var1
head: cannot open `var1' for reading: No such file or directory
--- end ---
访问参数1($ 1)到底发生了什么?为什么head和echo对它的解释却截然不同?
答案 0 :(得分:4)
$1
总是指在命令行上传递的第一个参数,它与通过 stdin 的任何输入分开。
head
期望作为其(非选项)参数的一个或多个文件名 - 如果没有,则从 stdin 读取输入。 (处理文件内容的许多实用程序都以这种方式运行)。
echo "asasa" | fun1
...仅限stdin输入,没有参数($1
未设置):
echo $1
回显空行(仅\n
),因为$1
未设置。head $1
回声(最多10行) stdin (asasa
):因为$1
未设置,就好像没有参数传递给head
,因此它从 stdin 读取。 echo "asasa" | fun1 "var1"
... stdin输入和1个参数:$1
设置为var1
。
echo $1
回显var1
,分配给$1
的值。head $1
报告错误,因为var1
被解释为文件名,并且不存在此类文件;在这种情况下, stdin输入 忽略。如果您希望echo
访问参数并head
访问 stdin输入,只需删除$1
参数即可head
命令:
function fun1 { echo $1; head; }
相反,如果您真的想要处理通过参数$1
传递的字符串head
,则必须通过 stdin 在中明确提供它脚本(例如,通过<<<
):
function fun1 { echo $1; head <<<"$1"; }
答案 1 :(得分:1)
head
只有在它的参数为空时才从stdin读取输入。由于你向它传递了一个参数,它试图改为读它。
Usage: head [OPTION]... [FILE]...
Print the first 10 lines of each FILE to standard output.
With more than one FILE, precede each with a header giving the file name.
With no FILE, or when FILE is -, read standard input.