在bash脚本中使用sleep和clear命令

在bash脚本中使用sleep和clear命令,bash,Bash,我正在学习Bash脚本 在我的脚本中,我尝试了clear和sleep 1 sleep 1按预期运行,但clear运行时未找到命令错误 为什么呢 在我的脚本中,clear和sleep 1都包含在反斜杠中。堆栈溢出使用这些符号来表示代码,我不知道如何使用转义符号在此处键入它们。在堆栈溢出中使用反引号,指示字符串应显示为代码。您的真实代码不需要反引号: echo "Hello from commandline" sleep 3 echo "After sleeping, will try to use

我正在学习Bash脚本

在我的脚本中,我尝试了
clear
sleep 1

sleep 1
按预期运行,但
clear
运行时未找到
命令
错误

为什么呢


在我的脚本中,clear和sleep 1都包含在反斜杠中。堆栈溢出使用这些符号来表示代码,我不知道如何使用转义符号在此处键入它们。

在堆栈溢出中使用反引号,指示字符串应显示为代码。您的真实代码不需要反引号:

echo "Hello from commandline"
sleep 3
echo "After sleeping, will try to use clear in 4 seconds"
sleep 1
echo "will try to use clear in 3 seconds"
sleep 1
echo "will try to use clear in 2 seconds"
sleep 1
echo "will try to use clear in 1 seconds"
sleep 1
clear
当您看到Unix代码中的反引号时,您会看到一种在命令执行期间调用另一个命令的老式方法

echo "Current time is `date`, so hurry!"
现在我们把它写成

echo "Current time is $(date), so hurry!"
在这个简单的例子中,它多了一个字符,但是嵌套更多的东西时效果更好。我甚至不会尝试用反引号写下下一个例子

echo "Previous command returned $(echo "Current time is $(date), so hurry!")."

我假设您正在尝试以下操作:

$(clear)
还是这个

`clear`
这是表达式命令替换的两种方式。第一种方法更具可读性,应该是首选方法,但它们的作用是相同的

解决方案是简单地使用以下方法:

clear
现在,如果您有兴趣了解为什么会出现这个错误,这里有一个较长的解释

命令替换捕获包含的命令的输出——更准确地说,是标准输出(文件描述符1)的输出,而不是标准错误(标准错误)——然后将此输出作为字符串提供,作为找到它的命令的一部分使用,就好像它是命令的一部分一样(但不受进一步扩张的限制)

clear
命令有一个特殊输出,可使终端屏幕清除。但是,通过将
clear
包含在反勾中,此特殊输出不会发送到终端(终端不清除)然后,这个特殊的输出就好像是在命令行上键入的一样提供的,因为它是该行上的第一个(也是唯一的一个)内容,所以shell尝试查找一个名称等于该特殊字符的命令,但它找不到,这就是您获得“未找到命令”错误

只是为了好玩,试试这个:

$(clear >&2)
它将清除屏幕,而不会触发错误,因为输出被重定向到文件描述符2(标准错误),该文件描述符2不会被命令替换捕获,而是实际发送到终端(清除),并且由于没有其他输出,命令替换计算为空字符串,Bash将其解释为不执行任何操作的请求(Bash不会尝试查找具有零长度名称的命令)


我希望这有助于您理解出现此错误的原因。

从控制台运行“which clear”并粘贴输出。请同时粘贴整个脚本…我应该能够非常快速地帮助您。若要在堆栈溢出上键入代码,请在换行后,在代码示例前面加上4个空格