スクリプトの実行に使用されるシェルをどのように出力しますか?
例: $SHELL 変数は、特定のユーザーにデフォルトのシェルを提供します。大丈夫です。ただし、特定のユーザーは別のシェルを使用してスクリプトを起動できます(例:「sh script.sh」または「csh script.sh」)。
Linuxマシンを使用してください。
答え1
Linuxを指定したので、これは機能しますreadlink -f /proc/$$/exe
。これは、標準出力でシェルスクリプト(たとえば/bin/bash
)を実行するシェルへのパスを提供します。したがって、これを変数に割り当てることができます(少なくともPOSIXシェルでは)var=$(readlink -f /proc/$$/exe)
。
$$
現在のシェルのpidです。/proc/«pid»/exe
"魔法の"シンボリックリンクの形で特定のpidで実行されている実行可能ファイルを照会できるカーネル機能。したがってreadlink
、を使用してパスを取得できます。
ps
Linux以外の場合はegを使用できますが、ps -o args= $$
これは最終的にスクリプト名を提供する可能性があります(POSIXでは両方の動作を許可します)。
たとえば、スクリプトがユーザーのシェルに変数を設定するように設計されていない場合は、一番#!
上の行を使用してスクリプトを実行するシェルを指定する必要があります。
答え2
スタンドアロンスクリプトは実行中のインタプリタをテストしないでください。これらのセルフチェックは厄介でエラーが発生しやすく、Unicesごとに異なる実装が必要になる場合があります。
たとえば、PerlスクリプトはPerlインタプリタによって解釈されていると常に安全であると仮定でき、Pythonスクリプトは常にPythonインタプリタによって実行できます。もしそうなら、スクリプトがbash
によって実行されていbash
てsh
スクリプトがによって実行されていると仮定してはいけません/bin/sh
。
特定のテスト能力bash
現在のインタプリタの問題は、配列バージョンを提供して$BASH_VERSION
テストすることとは異なります$BASH_VERSINFO
(たとえば)。
bash
それでは、実行するスクリプトbash
とcsh
実行するスクリプトをどのように取得しますかcsh
?まあ、ユーザーが通訳を選ぶのを避けることができます。
あなたはこれを行うことができます
ユーザーの混乱を防ぐために、スクリプトファイルにファイル名のサフィックスを追加しないでください。ファイル
bash
のスクリプトは、myscript.sh
ユーザーがそれが利用可能であると思うようにすることができますsh
。代わりにスクリプトを呼び出すだけですmyscript
。#!
(「shebang」または「hashbang」)行を使用してください。
-lineは#!
スクリプトの最初の行にあり(これらの2文字は#!
ファイルの最初の文字である必要があります)、使用するインタプリタのパスを指定します。
スクリプトbash
には次のものがあります。
#!/bin/bash
bash
これがシステムの実行可能ファイルへのパスであるbash
か、システムの任意の場所からインポートする場合は、$PATH
#!/usr/bin/env bash
たとえば、最初の行です。
これにより、関連していない他の言語ソルバーによって解釈または解釈されないことがbash
常に保証されます。sh
csh
python
次のステップは
- スクリプトを実行可能にするために使用されます
chmod +x myscript
。
これでスクリプトを実行できます
./myscript
これを実行するためにどの通訳者を使用しているのか心配しないでください。実際、スクリプトユーザーにとっては重要ではありません。別の言葉bash
スクリプトでも、Pythonスクリプトでも、コンパイルされたバイナリでも構いません。