質問: bashのPS1を変えるシェルスクリプトを書いています。 しかし、なぜか連続でそのコマンドを使おうとすると動きません。 書いたスクリプトは以下のようなものです。 ``` #!/bin/bash usage() { echo "Usage: cmd [-o] [-s] [-h]" } while getopts osh opt do case $opt in o ) PS1='\h:\W \u\$' ;; # original ps1 s ) PS1=' \W $ ' ;; # simple ps1 h ) usage ;; \? ) usage ;; esac done shift $((OPTIND - 1)) ``` `PS1`は環境変数なので、このスクリプトをそのまま実行しても動かないので、`.bashrc`に`alias cmd='source cmd'`を追加しました。 ターミナルを再起動し、`cmd -o`などとすると、起動後の一度目は動く(PS1が変化する)のですが、`cmd -s`と二度目以降に打っても動きません(PS1が変化しない)。 そこで、`cmd`とすると、その後1度目の`cmd -なんとか`は動きます。 原因を調べましたがわかりませんでした。 連続で実行しても動くようにしたいです。 どうすればいいのでしょうか。
回答: シェル起動時に`OPTIND`は1に初期化されますが、`source`で続けて同じシェルで実行した場合は`OPTIND`は前回実行後のままです。 実行後の`OPTIND`は、オプションの次の引数の番号なので、 ・オプションを指定した場合は、オプションでない最初の引数の番号(1より大きい) ・オプションを指定しない場合は、1 になります。 `getopt`は、引数の`OPTIND`番目を見るので、最初に`getopt`を実行する前に、`OPTIND=1`してください。