相关疑难解决方法(0)

为什么 cd 不是程序?

我一直想知道为什么cd不是程序,但从未设法找到答案。

有谁知道为什么会这样?

shell cd-command shell-builtin command

135
推荐指数
4
解决办法
2万
查看次数

[[ $a == z* ]] 和 [ $a == z* ] 有什么区别?

这两者有什么区别吗。

[[ $a == z* ]]
Run Code Online (Sandbox Code Playgroud)

[ $a == z* ] 
Run Code Online (Sandbox Code Playgroud)

我可以举一个例子,他们会有不同的输出吗?

此外, 的工作方式[[ ]][ ]?

bash shell-script wildcards test

39
推荐指数
2
解决办法
3856
查看次数

关键字、保留字和内置字之间的区别?

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可以是内置命令。

  1. “关键字”的定义是什么?
  2. “关键字”与“Bash 参考手册”中的“保留字”是同一个概念吗?

    保留字

    一个对壳有特殊意义的词。大多数保留字都引入了 shell 流控制结构,例如forwhile

  3. 关键字是否一定不是命令(或不是内置命令)?

    作为关键字,是time不是命令(或不是内置命令)?

    根据关键字和内建的定义,为什么time 不是内建而是关键字?

  4. 为什么“你可以做例如time { foo; bar; }”因为“time是一个关键字”?

bash

11
推荐指数
1
解决办法
4584
查看次数

是否可以以编程方式更改父 shell 的工作目录?

我想写一些代码来让我切换到一些我经常去的目录。说这个程序是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 脚本,这也可能会引入一些我不想要的功能。

  • 我可以用其他一些编程语言实现它吗?

shell bash cd-command

9
推荐指数
3
解决办法
6429
查看次数

使用格式选项调用`time`

我想测量命令的执行时间并获得(对我而言)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(可信赖)

linux time

5
推荐指数
1
解决办法
3396
查看次数

两次尝试使用带有“and”的 if 都失败了: if [ ... ] -a [ ... ] 、 if [[ ... && ... ]] 为什么?

在 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

4
推荐指数
2
解决办法
827
查看次数

为什么分词和文件名扩展不适用于 `[[ ... ]]` 中的条件表达式?

来自 Bash 参考手册

分词部分的规则:

shell 扫描没有出现在双引号内的参数扩展、命令替换和算术扩展的结果以进行分

文件名扩展部分的规则:

分词后,除非设置了 -f 选项(参见第 4.3.1 节 [The Set Builtin],第 58 页),Bash 会扫描每个单词以查找字符 '*'、'?' 和 '['。如果出现这些字符中的一个,则将该单词视为一个模式,并替换为按字母顺序排序的与该模式匹配的文件名列表

因此,在参数扩展、命令替换和算术扩展之后,除非在双引号内的部分上,否则会发生分词。

  1. 在 中[[ ... ]]GilesJohn1024都说分词和文件名扩展不适用于[[ ... ]]. Bash 参考手册或 POSIX 7 规范中的哪些规则管理它?

    • 里面的条件表达式[[ ... ]]不是双引号,那么为什么分词不适用呢?

    • -f选项未设置。为什么文件名扩展也不适用?

  2. 此外[[ ... ]],是否还有其他情况下分词、文件名扩展或两者都不适用?他们认为两者中的一个或两个不适用的原因是否与 相同[[..]]

  3. 分词和文件名扩展是否总是齐头并进,因为它们要么都适用,要么都不适用于每种情况?

bash

0
推荐指数
1
解决办法
370
查看次数