シェルスタイルで宣言された関数は、他のシェルタイプで使用できますか?

シェルスタイルで宣言された関数は、他のシェルタイプで使用できますか?

Linuxシステム用の多くの共通関数定義を含むbashスクリプトがあります。

それを取得し、他のシェルバージョン(cshとksh)の機能を使用できますか?

答え1

Stéphane Chazelasが書いたようにコメントcsh関連ファイルにはtcsh機能がないため、とにかく持っている機能ファイルをインポートできません。

ただし、Bourneに似たシェルは構文と機能を共有することが多く、実際にはbash多くの機能を借用しますkshが、これらのシェルの一部の機能は互換性がありませんdashUbuntu動作は元の Bourne シェルに近い。

発生するもう1つの問題は、関数だけでなく、関数が呼び出すことができるコマンドにも関連しています。 Ubuntuでこれらの機能を使用しても突然FreeBSDに移動した場合は、類似またはfind頻繁psに使用されるオプションが異なる動作または欠落していることがわかります。

したがって、関数を使用できるようにするには、コマンドとオプションの移植性を考慮し、POSIX標準と元のBourneシェル構文にできるだけ近い関数を作成することをお勧めします。

sudoまたは、必要なシェルを常にインストールできる場合(使用しているシステムに対する権限がないと発生しない可能性がある)、特定のシェル構文で関数を作成してください。

バラより移植可能なスクリプトを書くことはいつ重要ですか?より多くの情報を入手してください。

答え2

一般的に言えばそうではありません。

特にcsh(および)構文は派生シェル(、、、、)構文とは異なるtcshため、スクリプトを理解できない可能性が高く、その逆も同様です。shshbashkshzshsh

これらのshシェルは時々機能やスクリプト全体を共有することができますが、これは「最小共通分母シェル」(通常sh)の場合にのみ可能です。しかし、これは一般的に良い考えではありません。

各シェルをPerl、Ruby、Pythonなどの別々のスクリプト言語と考えてください。それらを混ぜるのではなく、通常、ある通訳者が別の通訳者のソースを理解できると仮定しないでください。

答え3

thumpの関数の周りにラッパースクリプトを作成するのは簡単です。

#!/bin/bash

doSomething()
{
    ...
}

doSomethingElse()
{
    ...
}

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

exit $?

呼ぶ:

/path/to/functionWrapper.sh doSomething [<param1>] [...]

答え4

特に、C シェルの場合、C シェルが機能をサポートしていないため、これはできません。これに加えて、Cシェルは異なる構文を使用します。たとえば、次のCシェルコードスニペットは、Bashで使用されるコードスニペットとは異なります。

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

関連情報