我正在编写一个自定义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/
答案 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