shebang定制外壳?

时间:2016-06-11 21:48:26

标签: linux shell

我正在编写一个自定义shell,我希望它能够执行一个脚本:

    <script type="text/javascript" src="http://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js"></script>
    <script type="text/javascript" src="https://cdn.datatables.net/1.10.12/js/dataTables.bootstrap.min.js"></script>

如果我从bash和我的自定义shell运行它,它会起作用:

if [ type less > /dev/null ];then PAGER=less; fi
echo $PAGER
printenv|grep $1|$PAGER

但是如果我启动我的shell然后尝试运行脚本,我会收到一条错误消息。

$ ./shell -f ../checkenv.sh GNOME
[13607] 
[13606] 
GNOME_KEYRING_CONTROL=
GNOME_KEYRING_PID=
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
INSTANCE=GNOME
XDG_CURRENT_DESKTOP=GNOME
(END)

这似乎是因为我没有shebang,但我不知道如何使用shebang作为自定义shell。我应该在$ ./shell 'PATH' is set to /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin. $ ../checkenv.sh GNOME 14786: executing ../checkenv.sh ../checkenv.sh: 2: [: type: unexpected operator 14786: executed $ 中安装自定义shell还是进行其他安排?

我的主要功能和我的readline功能是:

/usr/bin/

2 个答案:

答案 0 :(得分:2)

shebang行只是指定解释器的完整路径,加上(可选)要传递的参数。

显然,您的自定义shell需要-f后跟脚本名称,后跟任何要传递给脚本的参数。

所以只需将其添加为脚本的第一行:

#!/path/to/shell -f

并确保脚本具有执行权限。您的shell不必安装在/usr/bin;您只需在#!行指定完整路径。

还有/usr/bin/env黑客:

#!/usr/bin/env shell

但在许多系统上它不允许传递额外的参数。 (您可能考虑修改自定义shell,因此它将脚本名称作为不带-f的参数。)我在{{{I}中讨论了#!/usr/bin/env的优点和缺点。 3}}

请注意,#!机制由内核处理,而不是由shell处理。

答案 1 :(得分:1)

您可以简单地删除脚本测试中的方括号:

if type less > /dev/null ;then PAGER=less; fi
echo $PAGER
printenv|grep $1|$PAGER