今天遇到一个 shell 的问题,此前是 Linux 小白。从学 ruby 后才开始用 Linux 的。有一个问题请教一下大家。
我有两个 sh 文件 A.sh 和 B.sh
A.sh 中代码如下
#! /bin/sh
echo 'start'
source B.sh
echo 'end'
B.sh 代码如下
echo 'I am in the b.sh'
运行 A.sh 后,如果没有#! /bin/sh会正常打印三句话,但现在是报错,说
line3 source: B.sh file not found.
后来查了一些资料,只是简单的知道了 sh 和 bash 是不太相同的。但为什么会报那个错呢?文件明明就在那里呀?
以前还听过一种叫 zsh 的东西,是吗?
需要用 source ./B.sh
man bash
里的解释是:如果第一个参数不带 /
, 就会从 $PATH
里面找 (类似于找可执行文件的逻辑). 带有 /
的话才会认为是相对/绝对路径。完整的解释可以看 man bash
测试环境是 Bash 4.2.045
需要指出的是,在 Ubuntu 上,/bin/sh
实际是软链接到 /bin/dash
的。CentOS 上是软链接到 /bin/bash
的。dash 是 POSIX shell 的实现,功能不如 Bash 丰富。但在 source
的逻辑上貌似没区别。
ubuntu 下运行和楼主一样的问题, #! /bin/sh 改为 #! /bin/bash 后正常 估计 bash 会找当前目录,sh 不一定。
ps,没记错的话基础是 sh,然后有优化包装成 bash,zsh 等多个不同的 shell。
#15 楼 @evil850209 不建议这么做。当你 cd
进入一个陌生的目录里,再不小心打错命令,而打出来的命令恰好是当前目录下的一个有害的可执行文件,就会出问题。当然这种情况出现的可能性也并不高。
我的建议是,找到这段代码的原始作者,麻烦他把脚本改成 source ./B.sh
的形式。