asustor NAS: shellscript : shell名を取得する
はじめに
$SHELL には、/bin/sh
のように shell がフルパスで入っています。これでは使いにくいので、/bin/sh
→sh
のように shell 名を取得する shell script 関数を書きました。
shellの取得
こういうのはパターンマッチ(正規表現)の出番ですね。というわけで、bash のパターンマッチを使ってみます。
atsushifx@agartha $ echo ` [ '/bin/sh/' =~ 'sh' ]` $?
ash: =~: unknown operand
0
残念。組み込みの ash なので、対応していません。
sed/awk/grep の正規表現を試してみます。コマンドラインでいろいろと試してみます。
atsushifx@agartha $ echo '/bin/sh'|sed -e 's/([a-z]+)$/\1/']
/bin/sh
atsushifx@agartha $ echo '/bin/sh'|sed -E "s/([a-z]+)$/\1/"
/bin/sh
atsushifx@agartha $ echo '/bin/sh'|sed -e "s/^[^.]*\/([a-z]+)$/\1/"
/bin/sh
atsushifx@agartha $ echo '/bin/sh'|sed -E "s/^[^.]*\/([a-z]+)$/\1/"
sh
というわけで、sed の拡張パターンマッチ、sh
の \1。前のパスもマッチングさせることでsh
が取得できました。
shellの取得を関数化する
shell script 内で使えるように、関数化します。
次の手順で、関数を作成します。
-
関数のひな形の作成
bash での関数の作成方法を調べ、関数のひな形を作成します。
local function
とかfunction getsh(lsh)
とかも試したのですが、使えませんでした。function getsh() { local lsh sh }
-
パラメータの処理
shell script では、$1
,$2
でパラメータを参照できます。環境変数$SHELL
にログイン shell が格納されているので、パラメータを指定しないときは、$SHELL
を参照するようにします。function getsh() { local lsh sh if [ -z $1 ]; then lsh=$SHELL else lsh=$1 fi }
-
shell を取得
上記の sed のパターンマッチングを使い shell を取得します。function getsh() { local lsh sh if [ -z $1 ]; then lsh=$SHELL else lsh=$1 fi # get shell sh=`echo $lsh | sed -E 's/^[a-z/]*\/([a-z]+)$/\1/'` }
-
文字列のリターン
return 文では、数値しか返せません。取得した shell(sh
nなど)は文字列なので、echo で返却します。function getsh() { local lsh sh if [ -z $1 ]; then lsh=$SHELL else lsh=$1 fi # get shell sh=`echo $lsh | sed -E 's/^[a-z/]*\/([a-z]+)$/\1/'` echo $sh }
以上で、関数の作成は終了です。
上記の関数は、ログインスクリプト内に記述して shell 別に処理を分岐させたいときに使用します。
追記
コメントで言及された、環境変数の展開機能を試してみました。
shortsh=${SHELL##*}
これで、shell 名ash
が取得できます。
Discussion
ash
をお使いということでしたので、環境変数の展開機能を使って実現してはどうかな?と試してみました。いかがでしょう?
おお、できました。ありがとうございます。
Qiitaの Bashの変数展開と真摯に向き合う を読んできました
##で最長一致でのパターンマッチングおよび削除
*/で最後の
/
までの文字を削除ですね