__sil
@__sil

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

シェル変数にコマンドを入れて使うのは「あり」ですか?

最近シェルスクリプトの勉強を始めた初心者です。

なお、使用しているシェルはBashです。

以下のように、シェル変数にコマンド(正確には実行ファイルのパス)を格納して、そのシェル変数を呼び出すというのは、書き方として「あり」でしょうか。

#!/usr/bin/env bash

myexe=/my/dir/myexe
# 略(cdしたり他のコマンド実行したりしてます)
$myexe 1234 abcd > result1.out
# 略(また他のコマンドをいろいろ実行してます)
$myexe 5678 efgh > result2.out

現時点では個人的にあまり慣れない書き方なのですが、シェルスクリプトとしてはこれは普通の書き方ですか?
それとも、避けるべき書き方でしょうか。

避けるべきというのは、ほかの言語でいう「何もかもグローバル変数にするのはよくないよね」とか「1つの関数が余りにも巨大になるのは避けたいよね」くらいの意味合いで捉えていただけると助かります。

ググってみても、「そういう書き方はやめましょう」という情報が見当たらない一方で、シェル変数にコマンドを入れているコード例もあまり見つからず、判断に困っています。

自分で思いついた代替案としては、

  • シェル関数にする
  • expand_aliasesの設定が必要だが、aliasにする
  • PATHに:/my/dirを追記する(わざわざシェルスクリプト内でやらずとも~/.bash_profile内で追記すればいいのですが、今回はそれはなしで)

くらいでした。
PATHに追記する方法だと/my/dir内のmyexe以外のファイルも直に参照できるようになるので厳密には同等な代替手段ではありませんが、ひとまずそれは置いておきます。

シェル変数にコマンドと入れる方法と比較して、これらの方法はどうでしょうか。
今回のmyexeのようなケースの場合、どの書き方が好ましいと思いますか?

シェル変数を使う方法は記述が非常に簡単に済む点は気に入っているのですが…

0

2Answer

別にあってもいいけれどコマンド名を変数にするより.shファイルにしてsh名を変数にする方が関数っぽく見えるかもね。

0Like

Comments

  1. @__sil

    Questioner

    すみません、私の知識量の無さ故だと思うのですが、おっしゃる内容についていけていません。
    exportというのは環境変数の話ですか?
    何かしらの環境変数をメインのシェルスクリプト以外の場所で定義するということ?
  2. あってもいいのは起動スクリプトとかでは使われているから
    https://gist.github.com/vittee/7262943#file-httpd-L59
    第4の代替案として
    メインshと同じフォルダに細かい設定済みのshを呼べばメインshやコマンド環境を永続的に汚さないよねっということです
  3. @__sil

    Questioner

    なるほど、メインのshの中であれやこれや設定しなくても、myscript.shで適宜環境変数等を設定してmyexeを呼び出すようにしておけば、例えば
    ./myscript.sh
    と呼び出すだけで事足りる。myexeの実行に必要な諸々はmyscript.shが内部で請け負ってくれるので便利ということですね。
    ありがとうございます。

実行するコマンドを動的に差し替えたい場合などはそのように書くしかないですし、単に短く書きたいから使うのも普通にありだと思います。

ただファイルパスに空白を含む場合に備えてダブルクォートは使った方がいいですね。それだと結局煩雑になるので、関数にした方がマシかもしれません。

"$myexe" 1234 abcd > result1.out

# or

myexe() {
    "$myexe" "$@"
}

myexe 1234 abcd > result1.out
0Like

Comments

  1. @__sil

    Questioner

    今回はコマンドを短く書きたいだけで、ファイルパスは単語分割が行われないことがわかっている決め打ちのものなので、クオートしませんでした。
    クオートするとなるとやや呼び出しが煩雑になりますが、やはりシェル関数にしてしまうと便利ですね。
    回答ありがとうございました。シェルスクリプトの慣習等がまだよくわかっていないので助かりました。

Your answer might help someone💌