我正在学习如何使用 shell。在使用一些基本命令时,我遇到了一个问题。这是非常基本的东西,如果让某些人感到不快,我深表歉意。
我的桌面上有一个名为“myFirstShellScript.txt”的文件。该文件中有一行文本“show system”。
因此,如果我在打开 shell 后输入cd desktop
,然后 grep,"show system" myFirstShellScript.txt"
shell 将返回该字符串出现的句子。很好。
但我想乱搞一下。然后我输入grep "show system"
并按回车键。我想知道 grep 是否会搜索整个桌面,因为那是我的密码。
但似乎发生的事情是终端停止了工作。起初我以为它可能只是在忙于搜索,但已经有一段时间了。然后我检查了其他命令是否可以工作 - pwd - 什么也没做,当我按下回车键时,光标只是移动到新行。
然后我尝试退出。我尝试了“exit”、“end”和“quit”。什么都没有。终端窗口没有按预期响应。
我知道我可以轻松打开另一个选项卡,但想问我对这里的终端做了什么?
答案1
当您运行 时grep
,如果您包含文件名 ( grep pattern file
),它会搜索该文件。如果不包含,它会搜索标准输入 (stdin)。如果您将其包含在管道 ( foo | grep
) 中,它会从管道读取。当您只运行 时grep pattern
,它会从控制台读取输入。这是 Unix 和 Linux 实用程序中非常常见的模式。当您输入exit
、end
、quit
或其他任何内容时,它会将其与模式进行比较,如果匹配,则打印出来,就像您给了它一个文件一样。尝试输入与模式匹配的一行 - 您会看到它回显给您。
为了摆脱这种情况,请按Ctrl+D来表示文件结束。Ctrl+C可以终止大多数程序,但是不如Ctrl+干净D。
答案2
不带任何参数的 grep 会从标准输入(即您的终端)读取。它会一直读取,直到遇到文件结束符。文件结束符是Ctrl-D。输入这个字符,grep 就完成了。
如果这不起作用,请运行stty -a
并寻找eof = ...
以找到您的 eof 字符。
警告:不要输入Ctrl-D两次;第二个命令将被你的 shell 读取。如果这是你的登录 shell,它会认为你已完成并退出。每当你的登录 shell 退出时(就像你输入 时一样exit
),你的登录会话就结束了,login:
提示符会再次出现。换句话说,你已注销。