【发布时间】:2017-02-05 15:57:32
【问题描述】:
我搜索了各种留言板以了解为什么在某些情况下我不能将变量用作命令的输入。这是一个 STDIN 问题/限制吗?为什么使用echo 和此处的字符串可以解决问题?
例如,
~$ myvar=$(ls -l)
~$ grep Jan "$myvar"
grep: total 9
-rwxr-xr-x 1 jvp jvp 561 Feb 2 23:59 directoryscript.sh
-rw-rw-rw- 1 jvp jvp 0 Jan 15 10:30 example1
drwxrwxrwx 2 jvp jvp 0 Jan 19 21:54 linuxtutorialwork
-rw-rw-rw- 1 jvp jvp 0 Jan 15 13:08 littlefile
-rw-rw-rw- 1 jvp jvp 0 Jan 19 21:54 man
drwxrwxrwx 2 jvp jvp 0 Feb 2 20:33 projectbackups
-rwxr-xr-x 1 jvp jvp 614 Feb 2 20:41 projectbackup.sh
drwxrwxrwx 2 jvp jvp 0 Feb 2 20:32 projects
-rw-rw-rw- 1 jvp jvp 0 Jan 19 21:54 test1
-rw-rw-rw- 1 jvp jvp 0 Jan 19 21:54 test2
-rw-rw-rw- 1 jvp jvp 0 Jan 19 21:54 test3: File name too long
如您所见,我收到错误消息...“文件名太长”
现在,我可以使用以下任一方法来实现它:
echo "$myvar" | grep Jan
grep Jan <<< "$myvar"
但是,我真的在更好地理解为什么会这样。也许我遗漏了一些关于命令替换的基础知识或什么是可接受的 STDIN 形式。
【问题讨论】:
-
我认为这里没有问题。您的目录中似乎有一个名为
test3: File name too long的文件。顺便说一句,以编程方式使用ls输出从未被认为是一种好的做法。如果您有兴趣查找自特定时间以来已修改的文件,还有其他命令,例如find。 -
@codeforester 不,目录下没有这个文件,只是正确提出的错误信息的格式令人困惑。
-
如果它是一个错误,它不会结束 OP 的变量,因为 stderr 没有被分配给
myvar。 -
当您收到该错误消息时所看到的不是 grep 输出,而是仅 一条错误消息,实际上这里看起来像一个文件列表.但事实并非如此。
grep将整个输入(ls命令的输出)解释为单个文件名参数 以进行 grep。该文件名太长以至于引发错误。这里没有魔法。问题是错误消息再次包含建议的文件名。 看起来像是一个文件列表,所以是一个 grep 输出。但正如所说,事实并非如此。检查自己:使用超过 20 行的任意字符串运行 grep 命令。
标签: linux bash variables stdin