Shell padrão para executar scripts (sem shebang) em macos?

2

Eu tenho ZSH como shell padrão no MacOS, tudo está funcionando bem. ZSH é instalado como pacote de fermentação, Ive definir shell padrão na minha conta, novo shell está listado em /etc/shells... tudo está definido, como eu disse.

Eu tenho alguns scripts de shell em que eu uso alguns comandos de zsh, como print. Quando executo o script a partir da linha de comando, print o comando não é reconhecido e o script falha.

Este script faz não tem a linha shebang. Quando eu coloco a linha shebang para zsh, então tudo funciona; a print o comando está funcionando.

Desde que eu estou usando apenas ZSH, é possível definir shell padrão para executando scripts , então eu não tenho que colocar shebang line em meus scripts .zsh?

Ou é possível associar .zsh extensão para execução de shell ZSH?

Igor Spasic
fonte
1
Como exatamente você está executando esses scripts a partir do comando, como se eles não tivessem uma linha shebang?
Andrew Medico
Por nome do script.
Igor Spasic

Respostas:

4

o Concha Z usa /bin/sh se você executar um script executável sem a linha shebang (veja man zshmisc, seção EXECUÇÃO DE COMANDO ou check out esta resposta para uma lista abrangente). Isso parece codificado. Então, se você não quiser usar o unix-way (add shebang line), você pode usar um alias de sufixo no shell Z para executar todos os arquivos com uma certa extensão com um determinado programa. No seu caso

alias -s zsh=zsh

deve fazer o truque. A forma geral é (como o exemplo acima não é tão claro):

alias -s extension=program

A página man explica como isso funciona:

Se o sinalizador -s estiver presente, defina um alias de sufixo: se a palavra de comando em uma linha de comando estiver no formato text.nameonde texto   é qualquer string não vazia, ela é substituída pelo texto value text.name. Observe que o nome é tratado como uma string literal, não como   padronizar.

Um espaço à direita em valor não é especial neste caso. Por exemplo,

alias -s ps=gv

fará com que o comando *.ps para ser expandido para gv *.ps. Como a expansão de alias é realizada antes de globbing, o *.ps vai                 então ser expandido. Os aliases de sufixo constituem um espaço de nome diferente de outros aliases (portanto, no exemplo acima, ele ainda é   possível                 para criar um alias para o comando ps) e os dois conjuntos nunca são listados juntos.


Se você quiser usar scripts que estão localizados em algum lugar no seu $PATH, usar

alias -s zsh="zsh -o PATH_SCRIPT"

Isso permite a opção PATH_SCRIPT:

Se a opção PATH_SCRIPT estiver definida e o nome do arquivo não contiver um caminho de diretório (ou seja, não há `/ 'no nome), primeiro o diretório atual e, em seguida, o caminho de comando fornecido pela variável PATH          são pesquisados ​​pelo script.

Por favor, note que o diretório atual é procurado pelo script, mesmo se . não está no seu PATH!

mpy
fonte
Quando eu definir alias -s zsh=/usr/local/bin/zsh e invocar um script que está no caminho, mas não na pasta atual, então o sistema "não pode abrir o arquivo de entrada", o que faz sentido. Então, este é um passo em frente, mas ainda não a solução final ...
Igor Spasic
Ou, em outras palavras: se o argumento é o nome do arquivo que está no PATH, como encontrar seu caminho absoluto?
Igor Spasic
1
@IgorSpasic: Eu estendi minha resposta de acordo.
mpy