防止以./(点斜杠)启动bash脚本

时间:2015-05-25 15:08:23

标签: linux bash shell

我写了很多应该与当前bash会话一起使用的bash脚本,因为我经常使用fgjobs等。

我总是使用. script.sh启动我的脚本,但我的一位朋友用./script.sh启动它,并收到错误fg“无法执行”。 是否可以强制. script.sh或其他任何我可以做的事情来防止错误?例如取消整个脚本并使用echo或其他内容打印错误。

编辑: 我认为bashtraps在执行sourced时遇到问题,有没有办法在一个脚本中使用fgjobsbashtraps

3 个答案:

答案 0 :(得分:4)

看起来您正在尝试确定脚本是否以交互方式运行。 bash manual表示您可以通过以下测试确定:

#! /bin/bash

case "$-" in
*i*)  echo interactive ;;
*)    echo non-interactive ;;
esac

sleep 2 &
fg

如果您使用./foo.sh运行此操作,则会看到“非交互式”打印,并且fg内置错误。如果您使用. foo.shsource foo.sh来源,则不会出现该错误(假设您正在运行交互式shell中的错误)。

对于您的用例,您可以在非交互模式下退出并显示错误消息。

答案 1 :(得分:1)

如果您只需要工作控制,则可以使用#!/bin/bash -i

使其双向工作
#!/bin/bash -i
sleep 1 &
fg

无论您是. myscript还是./myscript,此脚本的工作方式都相同。

PS:你应该采用你朋友的执行脚本的方式。它更健壮,大多数人都会按照这种方式编写脚本(例如,假设exit将退出脚本)。

答案 2 :(得分:0)

有一些简单的技巧可以提醒人们使用source(或.)来运行您的脚本:首先,从中删除执行权限(chmod -x script.sh),这样运行它与./script.sh会给出一个权限错误。其次,用这样的东西替换正常的shebang(第一行):

#!/bin/echo please run this with the command: source

这将使脚本打印出类似“请运行此命令:source ./script.sh”(并且不运行实际脚本),如果有人设法执行它。

请注意,如果有人使用bash script.sh运行脚本,这些都不会有帮助。