Como devo lidar com a shebang ao escrever minha própria concha?

5

Estou escrevendo um script para testar um projeto de shell para ver se meu shell personalizado tem saída correta.

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 ***"

Esta é a saída do script

$ ./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 ***

A saída é esperada, mas se eu adicionar um shebang, o que é recomendado, então coisas estranhas acontecem. Este é o meu próprio shell que estou testando, então qual deve ser o shebang para scripts que devem ser executados com meu shell, que eu nomeei osh e posso colocar em /usr/local/bin ou instalar como outro shell?

Suponho que o shebang não deva ser #!/usr/bin/env bash , que é o que o meu editor (CLion) recomenda, e não pode ser #!/usr/bin/env osh porque não está instalado e dá resultados estranhos.

Como devo lidar com a shebang ao escrever minha própria concha?

    
por Niklas Rosencrantz 25.05.2016 / 14:45

1 resposta

12

Deve ser

#!/usr/local/bin/osh

se o seu shell estiver em /usr/local/bin . Se /usr/local/bin estiver no seu PATH , então

#!/usr/bin/env osh

deve funcionar também ... (Na verdade, esse é o único ponto de env aqui - ele encontrará osh onde quer que esteja instalado, contanto que esteja no PATH , então não importa se é em /usr/local/bin , /usr/bin etc. O primeiro encontrado ganha se várias cópias estiverem instaladas.)

Se você usar a variante env , certifique-se de que não haja outro binário osh no seu PATH : as schily aponta, a concha de Thompson pode ser instalada como osh (embora isso pareça improvável, mas já que você está pesquisando shells isso pode acontecer), e há também o shell de depuração do sistema de compilação OCaml (normalmente em um pacote omake ).

    
por 25.05.2016 / 14:48