こんにちは。よっしーです(^^)
今日は、スクリプトが起動しているシェルを調べる方法についてご紹介します。
背景
とあるスクリプトがエラーになるという報告を受けて調べていたところ、起動しているシェルが違うのではと思い、スクリプトが起動しているシェルを調べる方法についてご紹介します。
確認方法
下記のコマンドをスクリプトに含めて実行すれば、起動しているシェルを確認することができます。
ps -p $$
確認例
下記の内容でtest.shを作成します。
#!/usr/bin/env bash
ps -p $$
echo "test"
実行例1
下記のコマンドを実行すると、sh で起動していることがわかります。
% sh test.sh
PID TTY TIME CMD
32658 ttys006 0:00.01 sh test.sh
test
実行例2
下記のコマンドを実行すると、bash で起動していることがわかります。
% chmod +x test.sh
% ./test.sh
PID TTY TIME CMD
32872 ttys006 0:00.01 bash ./test.sh
test
実行例3
下記のコマンドを実行すると、zsh で起動していることがわかります。
% zsh test.sh
PID TTY TIME CMD
32990 ttys006 0:00.01 zsh test.sh
test
解説
ps -p $$
ps -p $$
は、ps
コマンドを使用して指定されたプロセスID(PID)の情報を表示するためのコマンドです。ここでは、$$
を使用して現在のシェルプロセスのPIDを指定しています。
具体的には、ps
コマンドに-p
オプションを指定し、その後にPIDを渡しています。$$
は現在のシェルプロセスのPIDを表す特殊な変数です。
ps -p $$
を実行すると、現在のシェルプロセスに関する情報が表示されます。一般的には、以下のような情報が表示されます:
- PID: プロセスの識別番号
- TTY: プロセスが接続されている端末(TTY)の名前
- TIME: プロセスが実行されたCPU時間
- CMD: プロセスの実行コマンド(シェルの種類など)
ps -p $$
を使用することで、現在のシェルプロセスに関する情報を確認することができます。
TTYとは
TTYは、”TeleTYpewriter(テレタイプライター)”の略であり、主にUNIXやUNIX系システムで使用される用語です。TTYは、コンピュータとユーザーの間でテキストベースの入出力を行うための仮想または物理的な端末を表します。
TTYは、以下のような役割を果たします:
- ユーザーとシステムの対話: TTYは、キーボードからの入力を受け付け、モニターやターミナルにテキストを出力することで、ユーザーとシステムの対話を可能にします。ユーザーがコマンドを入力し、システムがそれに応じた出力を返すために使用されます。
- プロセスの制御: TTYは、ジョブ制御と呼ばれる仕組みを通じて、プロセスの実行や停止を制御します。ユーザーがジョブをバックグラウンドに送ったり、再開したりする際にTTYが関与します。
TTYは、物理的なデバイス(例: シリアルポートやコンソール)または仮想的な擬似端末(PTY)として実装されることがあります。物理的なデバイスは、キーボードやモニターが接続された実際の端末を指します。仮想的な擬似端末は、ターミナルエミュレータやリモートログインなど、ソフトウェアによってシミュレートされた端末を指します。
TTYは、UNIXシステムにおけるシェルやコンソールの基盤となる要素であり、プロセスの制御や対話的な操作を可能にします。
例えば、下記のように他のターミナルから別のターミナルにメッセージを送ることもできます。
ターミナルを2つ起動させて、各TTYを確認します。
# Aのターミナル
% tty
/dev/ttys003
# Bのターミナル
% tty
/dev/ttys006
AのターミナルからBのターミナルにメッセージを送信します。
# Aのターミナル
% echo "from ttys003" > /dev/ttys006
Bのターミナルに下記のメッセージが表示されます。
% from ttys003
おわりに
今日は、スクリプトが起動しているシェルを調べる方法についてご紹介しました。
起動しているシェルを調べる主な理由は、以下のような場合です:
- プログラムの互換性の確認: シェルにはそれぞれ独自の構文や機能があります。特定のスクリプトやコマンドが特定のシェルでのみ動作する場合があります。そのため、起動しているシェルを知ることで、プログラムが想定した環境で実行されているかどうかを確認することができます。
- スクリプトの実行環境の特定: スクリプトが複数のシェルで動作する場合、特定のシェルを対象とした機能や構文を使用する必要があるかもしれません。起動しているシェルを知ることで、スクリプトがどの環境で実行されているかを特定し、適切なコードを実行することができます。
- デバッグやトラブルシューティング: シェルの種類によって、デバッグやトラブルシューティングの手法が異なる場合があります。起動しているシェルを把握することで、適切なデバッグ方法や解決策を見つける手助けとなります。
これらの理由から、特定のシェルがどのように起動しているかを調べることは、プログラムの正確な動作を確認するためや問題の解決に役立つ場合があります。
おまけ
ちなみに今回の調べる原因となったシェルは下記のようなエラーになっており、起動しているシェルがdashだったのが問題でした。なので、bashで起動するように修正しました。
% dash test.sh
PID TTY TIME CMD
34686 ttys006 0:00.01 dash test.sh
test.sh: 5: pushd: not found
test.sh: 6: popd: not found
% bash test.sh
PID TTY TIME CMD
34824 ttys006 0:00.01 bash test.sh
~ /tmp
/tmp
tesh.shの中身は下記になります。
#!/usr/bin/env bash
ps -p $$
pushd ~/
popd
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント