É possível usar funções declaradas em um tipo de shell em outro tipo de shell

4

Eu tenho um script bash que contém muitas definições de funções comuns para o nosso sistema Linux.

É possível obtê-lo e usar funções de outro tipo de shell (csh e ksh)?

    
por Guillaume 27.10.2017 / 12:23

4 respostas

2

Deve ser fácil criar um script wrapper em torno das funções; para Bash:

#!/bin/bash

doSomething()
{
    ...
}

doSomethingElse()
{
    ...
}

FUNCTION_NAME=$1
shift
${FUNCTION_NAME} "$@"

exit $?

Ligue:

/path/to/functionWrapper.sh doSomething [<param1>] [...]
    
por 27.10.2017 / 13:03
3

Como Stéphane Chazelas observou no comentários , csh e% relacionadostcsh não possuem funções, portanto você não pode criar o arquivo de funções que você possui.

No entanto, shells semelhantes a bourne geralmente compartilham sintaxe e funcionalidade, e de fato bash emprestou muita funcionalidade de ksh , mas alguns dos recursos desses shells não são compatíveis com dash - um padrão shell no Ubuntu e mais próximo no comportamento do shell Bourne original.

Outra questão que surge não é apenas sobre funções, mas comandos que as funções podem chamar. Se você estiver usando essas funções no Ubuntu e, de repente, for ao FreeBSD, descobrirá rapidamente que utilitários como find ou ps geralmente têm opções que se comportam de maneira diferente ou ausente.

Portanto, para ter certeza de que você pode usar funções, eu sugiro duas coisas: considere comandos e portabilidade de suas opções e duas funções de gravação que se ajustem ao POSIX padrão e à sintaxe original do shell Bourne o mais próximo possível.

Como alternativa, se você tiver o luxo de sempre instalar o shell que deseja (o que pode não acontecer se você não tiver sudo privileges no sistema em que está trabalhando), escreva suas funções na sintaxe de um shell específico. .

Veja Quando é importante escrever scripts portáteis? para informações adicionais.

    
por 27.10.2017 / 18:30
3

Em geral, não.

Em particular, csh (e tcsh ) têm uma sintaxe muito diferente das shells com sh ( sh , bash , ksh , zsh ), então elas seriam mais provavelmente não entenderá um script sh ou vice-versa.

Os sh shells podem, às vezes, compartilhar funções ou até mesmo scripts inteiros, mas somente se forem escritos para o "menor shell de denominador comum", que geralmente é sh . Isso, no entanto, geralmente não é uma boa ideia.

Pense em cada shell como uma linguagem de script separada, como Perl, Ruby e Python. Não os misture, e geralmente não assuma que um intérprete possa entender a origem de outro.

    
por 27.10.2017 / 12:30
1

Em específico para o C Shell, você não pode, já que o C Shell não suporta funções. Além disso, o C Shell usa uma sintaxe diferente. Por exemplo, os seguintes fragmentos do Shell C são diferentes do que o Bash usaria.

if ( $days > 365 ) then
   echo This is over a year.
endif
set i = 2
set j = 1
while ( $j <= 10 )
   echo '2 **' $j = $i
   @ i *= 2
   @ j++
end
    
por 27.10.2017 / 16:06