使用来源

时间:2018-11-15 21:39:15

标签: bash

我在名为reach.sh的文件中有一个bash脚本。

使用chmod 755 /Users/vb/Documents/util/bash/reach.sh授予此文件exe权限。

然后我使用alias reach='/Users/vb/Documents/util/bash/reach.sh'

创建了一个别名

到目前为止,效果很好。

碰巧我需要在当前进程中运行此脚本,因此从理论上讲,我需要在脚本路径之前添加.source

所以我现在有alias reach='source /Users/vb/Documents/util/bash/reach.sh'

这时,当我运行别名reach时,脚本失败。

错误 /Users/vb/Documents/util/bash/reach.sh:7: = not found

第7行 if [ "$1" == "cr" ] || [ "$1" == "c" ]; then

完整脚本

#!/bin/bash

# env
REACH_ROOT="/Users/vb/Documents/bitbucket/fork/self"

# process
if [ "$1" == "cr" ] || [ "$1" == "c" ]; then 
    echo -e "Redirection to subfolder"
    cd ${REACH_ROOT}/src/cr
    pwd

else 
    echo -e "Redirection to root folder"
    cd ${REACH_ROOT}
    pwd
fi

知道我可能会错过什么吗?

2 个答案:

答案 0 :(得分:0)

我正在zsh而不是bash shell中运行脚本,因此当我强制其在当前进程中运行时,它在zsh shell中运行,而没有不再识别bash命令。

答案 1 :(得分:0)

在您的问题中,您说“碰巧我需要在当前进程中运行此脚本”,所以我想知道为什么您完全使用source。只需运行脚本。观察:

bash-script.sh

#!/bin/bash

if [ "$1" == "aaa" ]; then
    echo "AAA"
fi

zsh-script.sh

#!/bin/zsh

echo "try a ..."
./bash-script.sh a
echo "try aaa ..."
./bash-script.sh aaa
echo "try b ..."
./bash-script.sh b

./zsh-script.sh的输出

try a ...
try aaa ...
AAA
try b ...

如果在zsh-script.sh中,我将source放在每个./bash-script.sh的前面,那么我确实会得到您在问题中描述的行为。

但是,如果您只需要“在当前进程中运行此脚本”,那么……就可以运行它。

source尝试将文件读取为当前shell解释的行,正如您所说的,zsh。但是只需运行 ,它会使第一行(#!/bin/bash“ shebang”行)启动一个新的shell 来解释这些行本身。这将完全解决bash上下文中zsh语法的使用。