由于.bashrc中的这一行,Bash的启动速度很慢。是什么原因造成的?


19

我的.bashrc文件包含一行以达到此效果:

alias prog="/path/to/script.sh $(find $(pwd) -name prog)"

当我注释掉这一行时,当我打开一个新终端时,Bash几乎立即启动。有了这一行,我的光标出现之前有4-5秒的延迟。

删除嵌套的命令$(pwd)等也可以再次加快它的速度。为什么会这样呢?我还能以某种方式使用嵌套命令吗?


4
问题在于find命令,该命令在引导时执行,并且可能需要很长时间才能执行,具体取决于目录结构。如果使用单引号而不是双引号,find将在运行时在alias调用时执行。这取决于要使用的工作目录,在声明时或在运行时当前使用的工作目录。顺便$(pwd)说一句,表达.或表达是一种相当低效的方式$PWD
AFH

15
我知道这不是您要的内容,但这看起来很像XY问题。为什么需要使用查找脚本find?一旦安装,就知道它在哪里。即使您经常更新它并更改其名称,您也可以维护到它的符号链接,以便始终以固定名称使用它。
sleske '17

5
@AFH请张贴答案作为答案,而不是评论。
大卫·里希比

1
@DavidRicherby-我想在发布之前确保这确实是答案。我不知道该脚本可以在任意目录中找到的文件上工作。
AFH

Answers:


45

由于命令替换在双引号内,因此在定义命令时对其进行评估。这会导致find.bashrc运行时浏览您的硬盘内容。

相比之下,您似乎希望在使用时对其进行评估。在这种情况下,请使用单引号:

alias prog='/path/to/script.sh $(find "$(pwd)" -name prog)'

请注意,如果找到的任何文件名称中都有空格,则此别名将失败。为了避免这种情况:

alias prog='find . -name prog -exec /path/to/script.sh {} +'

对于任何类型的文件名,后一种形式都将可靠地工作。


1
“使用时间”。第二行避免生成子外壳。
rleir '17

11
不利的一面是,现在每次键入progfind都需要运行,而之前,它只能运行一次(在shell启动时)。
el.pescado

再说一次,由于文件缓存,第二次运行相同find的文件通常要快得多。
reinierpost

21
@ el.pescado从好的方面来说,很难想象预期的行为是在用户登录时存在的文件上运行命令,而不是在用户执行命令进行处理时存在的文件上运行命令。
大卫·里希比

2
@DavidRicherby也许如果旧路径不再存在,我们可以缓存路径prog并重新运行find吗?
Alex Vong
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.