我写了很多应该与当前bash会话一起使用的bash脚本,因为我经常使用fg
,jobs
等。
我总是使用. script.sh
启动我的脚本,但我的一位朋友用./script.sh
启动它,并收到错误fg
“无法执行”。
是否可以强制. script.sh
或其他任何我可以做的事情来防止错误?例如取消整个脚本并使用echo
或其他内容打印错误。
编辑:
我认为bashtraps
在执行sourced
时遇到问题,有没有办法在一个脚本中使用fg
,jobs
和bashtraps
?
答案 0 :(得分:4)
看起来您正在尝试确定脚本是否以交互方式运行。 bash manual表示您可以通过以下测试确定:
#! /bin/bash
case "$-" in
*i*) echo interactive ;;
*) echo non-interactive ;;
esac
sleep 2 &
fg
如果您使用./foo.sh
运行此操作,则会看到“非交互式”打印,并且fg
内置错误。如果您使用. foo.sh
或source foo.sh
来源,则不会出现该错误(假设您正在运行交互式shell中的错误)。
对于您的用例,您可以在非交互模式下退出并显示错误消息。
答案 1 :(得分:1)
如果您只需要工作控制,则可以使用#!/bin/bash -i
:
#!/bin/bash -i
sleep 1 &
fg
无论您是. myscript
还是./myscript
,此脚本的工作方式都相同。
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
运行脚本,这些都不会有帮助。