我一直想知道为什么cd
不是程序,但从未设法找到答案。
有谁知道为什么会这样?
我正在尝试将我目录中所有 xml 文件的时间戳更新为当前时间(递归)。我使用的是 Mac OSX 10.8.5。
在大约 300,000 个文件上,以下echo
命令需要10 秒:
for file in `find . -name "*.xml"`; do echo >> $file; done
Run Code Online (Sandbox Code Playgroud)
但是,以下touch
命令需要10 分钟!:
for file in `find . -name "*.xml"`; do touch $file; done
Run Code Online (Sandbox Code Playgroud)
为什么这里的回声比触摸快得多?
从有关的printf是否是这个问题,一个内置的佳日,谈到这个答案是报价POSIX标准。
答案指出,POSIX 搜索顺序是查找所需命令的外部实现,然后,如果 shell 已将其实现为内置,则运行内置。(对于不是特殊内置函数的内置函数。)
为什么 POSIX 要求在允许运行内部实现之前存在外部实现?
似乎……随意,所以我很好奇。
为什么ls
需要一个单独的进程来执行?我知道为什么像这样的命令cd
不能通过分叉机制执行,但是如果ls
不分叉就执行有什么危害吗?
从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
是一个关键字”?
我正在玩type
和which
命令,我发现了一些奇怪的东西。
type
或者返回的路径或者说,一个命令是一个bash内置的。
which
要么返回内置插件,如路径或没有exit
或type
奇怪的是,type echo
说 echo 是我预期的内置。
但是which echo
将 /bin/echo 作为 echo 可执行文件的路径。对于任何其他内置命令,这似乎不会发生。
我想知道两者之间的区别是什么,Bash 选择在脚本和命令行中执行哪一个,以及这两个回声背后的故事是什么。
我的系统是 Ubuntu Desktop 12.04
我明白那个
sudo cd /directory
Run Code Online (Sandbox Code Playgroud)
将返回:
sudo: cd: command not found
Run Code Online (Sandbox Code Playgroud)
因为 cd 是内置的 shell 而不是二进制文件。但是,为什么
sudo echo 'this is a test'
Run Code Online (Sandbox Code Playgroud)
工作正常?
这里到底发生了什么?如果不是shell,如何sudo
找到命令echo
?
shell ×5
echo ×3
bash ×2
cd-command ×2
command ×2
executable ×1
fork ×1
ls ×1
posix ×1
sudo ×1