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

时间:2017-02-28 10:04:12

标签: bash

我正在学习Bash脚本。

在我的脚本中,我尝试过clearsleep 1

sleep 1按预期运行,但clear运行时出现command not found错误。

为什么?

clear和sleep 1包含在我脚本的反斜杠中。 Stack Overflow使用这些符号来表示代码,我不知道如何使用转义符号在这里输入它们。

2 个答案:

答案 0 :(得分:0)

反向引用在Stack Overflow中使用,表示字符串应显示为代码。您的真实代码不需要反引号:

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!"

在这个简单的情况下,这是一个更多的char,但在嵌套更多的东西时要好得多。我甚至不会尝试使用反引号来编写下一个示例

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

答案 1 :(得分:0)

我假设你正在尝试这个:

$(clear)

或者这个

`clear`

这是表达式命令替换的两种方式。第一个更具可读性,应该是首选,但它们也是一样的。

解决方案是简单地使用它:

clear

现在,如果您有兴趣了解收到此错误的原因,请参阅更长的解释。

命令替换捕获所包含命令的输出 - 标准输出(文件描述符1)的输出,而不是标准错误(标准错误),更准确 - 然后将此输出提供为要使用的字符串作为发现它的命令的一部分,好像它已经成为命令的一部分(但不需要进一步扩展)。

clear命令有一个特殊输出,可以清除终端屏幕。但是通过将clear括在反引号中,此特殊输出不会发送到终端(终端不会清除),而是由命令替换捕获。然后,提供这个特殊输出就好像它已经在命令行上输入一样,并且由于它是该行上的第一个(也是唯一的)东西,shell试图找到一个名称等于该特殊字符的命令,它找不到,这就是你得到“命令未找到”的错误。

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

$(clear >&2)

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

我希望这有助于您了解导致此错误的原因。