🍆

asustor NAS: shellscript : shell名を取得する

commits2 min read 3

はじめに

$SHELL には、/bin/shのように shell がフルパスで入っています。これでは使いにくいので、/bin/shshのように 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 内で使えるように、関数化します。
次の手順で、関数を作成します。

  1. 関数のひな形の作成
    bash での関数の作成方法を調べ、関数のひな形を作成します。
    local functionとかfunction getsh(lsh)とかも試したのですが、使えませんでした。

     function  getsh()
     {
       local lsh sh
     }
    
  2. パラメータの処理
    shell script では、$1,$2でパラメータを参照できます。環境変数$SHELLにログイン shell が格納されているので、パラメータを指定しないときは、$SHELLを参照するようにします。

    function  getsh()
    {
      local lsh sh
    
      if [ -z $1 ]; then
        lsh=$SHELL
      else
        lsh=$1
      fi
    }
    
  3. 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/'`
    }
    
  4. 文字列のリターン
    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が取得できます。

GitHubで編集を提案

Discussion

ash をお使いということでしたので、環境変数の展開機能を使って実現してはどうかな?と試してみました。

$ echo $SHELL
/bin/ash

$ echo ${SHELL##*/}
ash

いかがでしょう?

おお、できました。ありがとうございます。

ログインするとコメントできます