我有一个bash脚本,它需要bash程序。
另一个人试图运行它,使用的是
sh script_name.sh
它失败了,因为在他的发行版中,sh是指向dash的符号链接。
$ ls -la /bin/sh
lrwxrwxrwx 1 root root 4 Aug 25 16:06 /bin/sh -> dash
我有一个使用包装脚本的想法:
#!/bin/sh
bash script_name.sh
该目标是通过bash在系统上运行.sh脚本,该系统具有指向dash的符号链接。
我有一个bash脚本,它需要bash程序。
另一个人试图运行它,使用的是
sh script_name.sh
它失败了,因为在他的发行版中,sh是指向dash的符号链接。
$ ls -la /bin/sh
lrwxrwxrwx 1 root root 4 Aug 25 16:06 /bin/sh -> dash
我有一个使用包装脚本的想法:
#!/bin/sh
bash script_name.sh
该目标是通过bash在系统上运行.sh脚本,该系统具有指向dash的符号链接。
通常,你使用shebang来告诉shell使用正确的解释器:
#!/bin/bash
# your script here
您需要将脚本设置为可执行:
chmod +x my_script.sh
让用户通过以下方式开始:
./my_script.sh
使用包装脚本似乎比较简单。
即使用户使用sh/dash或任何类似的解释器,您也可以使用jbr test在bash中运行您的脚本:
#!/bin/bash
if [ -z "$BASH_VERSION" ]
then
exec bash "$0" "$@"
fi
# Your script here
这样它就能正确地与以下任一方式配合使用:
sh ./my_script.sh
# or
bash ./my_script.sh
# or
./my_script.sh
sh script.sh
。 - jbrif [ "$BASH" != "/bin/bash" ]; then
echo "Please do ./$0"
exit 1
fi
或者更一般的方法是使用$BASH_VERSION
:
if [ -z "$BASH_VERSION" ]; then
echo "Please do ./$0"
exit 1
fi
if [ ! "$BASH" ];
可能是更好的方法。 - devnull$BASH
可能是/bin/sh
。 - jbrbash
在/usr/bin
中可用,那该怎么办? - devnullif [ "$BASH" != $( which bash ) ]
,或者使用 $BASH_VERSION
。 - jbr
bash script_name.sh
运行?- 一个包装器也可以。你有什么问题? - John3136bash
,脚本应该使用/bin/bash script_name.sh
运行,并以#!/bin/bash
开始该脚本... - Basile Starynkevitch/bin/sh
。/bin/sh
是一个“虚拟”shell,可以由支持POSIX标准的任何shell实现。 - chepner