在编写自己的 shell 时,我应该如何处理 shebang?

在编写自己的 shell 时,我应该如何处理 shebang?

我正在编写一个脚本来测试 shell 项目,以查看我的自定义 shell 是否具有正确的输出。

str="HELLO"
echo $str
echo "*** YOU SHOULD SEE HELLO ABOVE ***"
ls *
echo "*** YOU SHOULD SEE THE OUTPUT FROM ls * ABOVE ***"
who|awk '{print $1}'
echo "*** YOU SHOULD SEE THE OUTPUT FROM who ABOVE ***"
echo $((1+2*3-4/5+6*7-8/9)))
echo "*** YOU SHOULD SEE THE NUMBER 49 ABOVE ***"

这是脚本的输出

$ ./shell < ../tst_exp.sh 
'PATH' is set to /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin.
HELLO
*** YOU SHOULD SEE HELLO ABOVE ***
CMakeCache.txt       hello_2.7-0ubuntu1_amd64.changes  hello_2.7-0ubuntu1.diff.gz  hello_2.7.orig.tar.gz  jeff      not  script.sh  testresult.txt
cmake_install.cmake  hello_2.7-0ubuntu1_amd64.deb      hello_2.7-0ubuntu1.dsc      hello-2.7.tar.gz   Makefile  osh  shell

build-area:
hello_2.7-0ubuntu1_amd64.build    hello_2.7-0ubuntu1_amd64.deb  hello_2.7-0ubuntu1.dsc
hello_2.7-0ubuntu1_amd64.changes  hello_2.7-0ubuntu1.diff.gz    hello_2.7.orig.tar.gz

.bzr:
branch  branch-format  branch-lock  checkout  README  repository

CMakeFiles:
3.5.1          CMakeDirectoryInformation.cmake  CMakeRuleHashes.txt  feature_tests.bin  feature_tests.cxx  Makefile.cmake  shell.dir    TargetDirectories.txt
cmake.check_cache  CMakeOutput.log          CMakeTmp         feature_tests.c    Makefile2          progress.marks  shellparser.dir

hello:
ABOUT-NLS   AUTHORS    ChangeLog    config.in  configure.ac  COPYING  doc     INSTALL      Makefile.in  NEWS  README  tests   TODO
aclocal.m4  build-aux  ChangeLog.O  configure  contrib       debian   gnulib  Makefile.am  man      po    src     THANKS

hello-2.7:
ABOUT-NLS   AUTHORS    ChangeLog    config.h   config.log     configure     contrib  doc     INSTALL   Makefile.am  man   osh  README  stamp-h1  THANKS
aclocal.m4  build-aux  ChangeLog.O  config.in  config.status  configure.ac  COPYING  gnulib  Makefile  Makefile.in  NEWS  po   src     tests     TODO
*** YOU SHOULD SEE THE OUTPUT FROM ls * ABOVE ***
[21420] 
dac
dac
*** YOU SHOULD SEE THE OUTPUT FROM who ABOVE ***
49
*** YOU SHOULD SEE THE NUMBER 49 ABOVE ***

输出是预期的,但如果我添加推荐的 shebang,则会发生奇怪的事情。这是我自己正在测试的 shell,那么对于应该与我的 shell 一起运行、我命名并可以像另一个 shell 一样osh放入或安装的脚本,shebang 应该是什么?/usr/local/bin

我想 shebang 不应该#!/usr/bin/env bash是我的编辑(CLion)推荐的,而且它也不可能是#!/usr/bin/env osh因为它没有安装并且给出了奇怪的结果。

在编写自己的 shell 时,我应该如何处理 shebang?

答案1

它应该是

#!/usr/local/bin/osh

如果您的外壳位于/usr/local/bin.如果/usr/local/bin在你的PATH那么

#!/usr/bin/env osh

应该也可以...(事实上,这是env这里唯一的一点 - 它会找到osh它安装的任何地方,只要它在 上PATH,所以它是否在 等中并不重要/usr/local/bin/usr/bin如果有多个副本,第一个找到的获胜已安装。)

如果您使用该变体,只需确保您的: as上env没有其他二进制文件oshPATH狡猾的指出,汤普森壳可以安装为osh(虽然这让我觉得不太可能,但因为你正在研究 shell,它可能会发生),而且还有 OCaml 构建系统的调试 shell(通常在一个omake包中)。

相关内容