スクリプトを実行するときにどのSHELLが使用されたかをどうやって知ることができますか? [コピー]

スクリプトを実行するときにどのSHELLが使用されたかをどうやって知ることができますか? [コピー]

スクリプトの実行に使用されるシェルをどのように出力しますか?

例: $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、を使用してパスを取得できます。

psLinux以外の場合はegを使用できますが、ps -o args= $$これは最終的にスクリプト名を提供する可能性があります(POSIXでは両方の動作を許可します)。

たとえば、スクリプトがユーザーのシェルに変数を設定するように設計されていない場合は、一番#!上の行を使用してスクリプトを実行するシェルを指定する必要があります。

答え2

スタンドアロンスクリプトは実行中のインタプリタをテストしないでください。これらのセルフチェックは厄介でエラーが発生しやすく、Unicesごとに異なる実装が必要になる場合があります。

たとえば、PerlスクリプトはPerlインタプリタによって解釈されていると常に安全であると仮定でき、Pythonスクリプトは常にPythonインタプリタによって実行できます。もしそうなら、スクリプトがbashによって実行されていbashshスクリプトがによって実行されていると仮定してはいけません/bin/sh

特定のテスト能力bash現在のインタプリタの問題は、配列バージョンを提供して$BASH_VERSIONテストすることとは異なります$BASH_VERSINFO(たとえば)。

bashそれでは、実行するスクリプトbashcsh実行するスクリプトをどのように取得しますかcsh?まあ、ユーザーが通訳を選ぶのを避けることができます。

あなたはこれを行うことができます

  • ユーザーの混乱を防ぐために、スクリプトファイルにファイル名のサフィックスを追加しないでください。ファイルbashのスクリプトは、myscript.shユーザーがそれが利用可能であると思うようにすることができますsh。代わりにスクリプトを呼び出すだけですmyscript

  • #!(「shebang」または「hashbang」)行を使用してください。

-lineは#!スクリプトの最初の行にあり(これらの2文字は#!ファイルの最初の文字である必要があります)、使用するインタプリタのパスを指定します。

スクリプトbashには次のものがあります。

#!/bin/bash

bashこれがシステムの実行可能ファイルへのパスであるbashか、システムの任意の場所からインポートする場合は、$PATH

#!/usr/bin/env bash

たとえば、最初の行です。

これにより、関連していない他の言語ソルバーによって解釈または解釈されないことがbash常に保証されます。shcshpython

次のステップは

  • スクリプトを実行可能にするために使用されますchmod +x myscript

これでスクリプトを実行できます

./myscript

これを実行するためにどの通訳者を使用しているのか心配しないでください。実際、スクリプトユーザーにとっては重要ではありません。別の言葉bashスクリプトでも、Pythonスクリプトでも、コンパイルされたバイナリでも構いません。

関連情報