我一直想知道为什么cd不是程序,但从未设法找到答案。
有谁知道为什么会这样?
这两者有什么区别吗。
[[ $a == z* ]]
Run Code Online (Sandbox Code Playgroud)
和
[ $a == z* ]
Run Code Online (Sandbox Code Playgroud)
我可以举一个例子,他们会有不同的输出吗?
此外, 的工作方式[[ ]]与[ ]?
从Make bash use external `time` 命令而不是 shell built-in,Stéphane Chazelas 写道:
没有
time内置 bash。time是一个关键字,所以你可以做例如time { foo; bar; }
我们可以验证一下:
$ type -a time
time is a shell keyword
time is /usr/bin/time
Run Code Online (Sandbox Code Playgroud)
它没有显示time可以是内置命令。
“关键字”与“Bash 参考手册”中的“保留字”是同一个概念吗?
保留字
一个对壳有特殊意义的词。大多数保留字都引入了 shell 流控制结构,例如
for和while。
关键字是否一定不是命令(或不是内置命令)?
作为关键字,是time不是命令(或不是内置命令)?
根据关键字和内建的定义,为什么time
不是内建而是关键字?
为什么“你可以做例如time { foo; bar; }”因为“time是一个关键字”?
我想写一些代码来让我切换到一些我经常去的目录。说这个程序是mycd,/a/very/long/path/name是我要去的目录。
所以我可以简单地输入mycd 2而不是cd /a/very/long/path/name. 这里我假设mycd知道2是指那个/a/very/long/path/name。也可能有mycd 1, mycd 3, ... 等。
问题是我必须编写mycd一个 shell 脚本并输入. mycd 2来做所需的事情,否则脚本只会在子脚本中执行,这不会改变我真正关心的父 shell 的任何内容。
我的问题是:
我可以不使用它source吗?因为. mycd假设mycd必须是一个 shell 脚本,这也可能会引入一些我不想要的功能。
我可以用其他一些编程语言实现它吗?
我想测量命令的执行时间并获得(对我而言)time命令的奇怪行为。
我调用time它就像在带有-for--format选项的联机帮助页的示例中提到的那样并得到一个command not found错误。似乎它认为-f是测量...的执行时间的命令
user@laptop:~$ time -f '%e' sleep 1
-f: Befehl nicht gefunden.
Run Code Online (Sandbox Code Playgroud)
然后我再次调用同一行,只是指定了time. 结果更改,按预期工作(wtf?):
user@laptop:~$ /usr/bin/time -f '%e' sleep 1
1.00
Run Code Online (Sandbox Code Playgroud)
现在我很困惑......甚至which无法帮助我:
user@pc:~$ which time
/usr/bin/time
Run Code Online (Sandbox Code Playgroud)
而且...如果我不使用选项它工作正常,即使没有完整路径:
user@laptop:~$ time sleep 1
real 0m1.003s
user 0m0.001s
sys 0m0.002s
Run Code Online (Sandbox Code Playgroud)
如果要指定选项,如何正确使用此命令?使用完整路径似乎有效,但看起来更像是错误的东西(或我不明白的东西)的不可靠的副作用?
编辑:我使用的是 Ubuntu 14.04 LTS(可信赖)
在 bash 脚本中,我愿意检查参数是否具有布尔值(“true”或“false”)。
我正在以两种不同的方式在两个脚本中尝试此操作,但都失败了。
我已经检查了许多 Stack Exchange 提示,并且我相信做了我应该做的事情,但事实并非如此。
if [ "$2" != "true" ] -a [ "$2" != "false" ]; then
echo "Indiquez si Geoserver est en installation initiale (false) ou update (true)" >&2;
exit 1;
fi
Run Code Online (Sandbox Code Playgroud)
失败并显示消息Geoserver.sh: 12: [: true: unexpected operator
if [[ "$3" != "true" && "$3" != "false" ]]; then
echo "Indiquez si Kafka est en installation initiale (false) ou update (true)" >&2;
exit 1;
fi
Run Code Online (Sandbox Code Playgroud)
失败了Kafka.sh: 18: [[: not found
来自 Bash 参考手册
分词部分的规则:
shell 扫描没有出现在双引号内的参数扩展、命令替换和算术扩展的结果以进行分词。
文件名扩展部分的规则:
分词后,除非设置了 -f 选项(参见第 4.3.1 节 [The Set Builtin],第 58 页),Bash 会扫描每个单词以查找字符 '*'、'?' 和 '['。如果出现这些字符中的一个,则将该单词视为一个模式,并替换为按字母顺序排序的与该模式匹配的文件名列表
因此,在参数扩展、命令替换和算术扩展之后,除非在双引号内的部分上,否则会发生分词。
bash ×5
cd-command ×2
shell ×2
command ×1
linux ×1
shell-script ×1
test ×1
time ×1
wildcards ×1