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(shnなど)は文字列なので、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の変数展開と真摯に向き合う を読んできました
##で最長一致でのパターンマッチングおよび削除
*/で最後の
/までの文字を削除ですね