どのように私は、スクリプトファイル名bashスクリプトを知っていますか?

内部スクリプト自体を決定する方法のBashスクリプトファイル名を?

私のスクリプトファイルと同様にrunme.sh、私のニュース「あなたはrunme.shを実行している」どのように表示をハードコーディングせずに、?


#1階

this="$(dirname "$(realpath "$BASH_SOURCE")")"

これも、ソースコード(../myscript)の中にシンボリックリンクの場合を(実パスを行うことができます)、スペースを(これを行うことができ、二重引用符を使用)扱うことができ、または他のスクリプトは($ BASH_SOURCEが扱うことができる)を呼び出す解決します、あなたはまた、現在のスクリプトの名前を見つけることができます。結局のところ、それは再利用のための環境変数に保存することが最良であるか、簡単に(これ=)他の場所に複製します...


ハウス#2

me=`basename "$0"`

シンボリックリンクは、あなたが望むものではありません通常読み取るには1(あなたが一般的にユーザーを混乱させたくないということ)、試してみてください。

me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"

IMO、これは紛らわしい出力を生成します。「私はfoo.shを走ったが、これは私が!?bar.shを実行していますバグ!でなければならないと言うことです」また、別の名前を目的としたリンクのシンボルの一つは、いくつかの中で(その名前に応じてさまざまな機能を提供することですプラットフォームは、gzipとgunzipの)考えることができます。


1つまり、ユーザーが実行時にそうすることを、シンボリックリンクを解決するためにfoo.sh(実際にはbar.shシンボリックリンク)が、あなたが名前解決を使用するbar.sh代わりに、foo.sh


ハウス#3

エコー「あなたは$ 0実行しています」


#4階

あなたが使用できる、唯一のスクリプトの名前を取得します - あなたは(フルパスで)スクリプト名を決定するために$ 0使用することができます

basename $0

ハウス#5

スクリプト名にスペースが含まれている場合は、より堅牢なアプローチが使用することです"$0""$(basename "$0")"-またはMacOSで使用"$(basename \\"$0\\")"これは、混乱やどのような方法では、名前を説明し防ぐことができます。一般的には、良い練習は常に二重引用符でシェルにあります。


ハウス#6

$0(私が理解される)の質問に答えていません。デモ:

$猫script.shの
#!/ binに/ shの
エコー`ベース名$ 0 ' 
$ ./script.sh 
script.sh 
$ LN script.sh linktoscript 
$ ./linktoscript 
linktoscript

どうすれば入手できますか./linktoscriptプリントアウトしますかscript.sh

[編集]は、上記のコメントで@ephemientは、架空のようですが、それでもいじりすることができるが$0、それはファイルシステムリソースという意味ではありません。OPは、彼が望んでいるコンテンツの曖昧ビット。


#7の構築

答えるためにクリス・コンウェイを少なくともで、Linuxの上で、あなたはこれを行うことができます。

echo $(basename $(readlink -nf $0))

シンボリックリンクの値からプリントをREADLINK。それがシンボリックリンクでない場合は、ファイル名を印刷します。-nは、改行を印刷しないように指示します。-fは、それが(シンボリックリンクが別のリンクへのリンクの場合、リンクが解決されます)完全にリンクに従うことを伝えます。


#8の構築

あなたがそれをしたい場合はパスがない、あなたが使用することができます${0##*/}


ハウス#9

私はこの旅行に関係なく、ソースファイルやスクリプトファイルのように実行され、常に有効で見つかりました。

echo "${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}"

あなたはシンボリックリンクをフォローしたい場合は、ご到着のパスに再帰的または非再帰的に使用しますreadlink

使用することでBASH_SOURCE、環境変数との関連をFUNCNAME単一のラインの仕事を説明します。

BASH_SOURCE

そのメンバーハウジング対応する関数名FUNCNAME配列変数で定義されているソースファイル名、ある配列変数。ハウジング関数ファイルの$ {FUNCNAME [$ i]は} $ {BASH_SOURCEは[$ i]を}に定義され、$ {BASH_SOURCE [$ I + 1]}コールからのものです。

関数名

実行コールスタック内のすべての現在含む配列変数シェル関数の名前。インデックスの要素0は、現在実行されている任意のシェル関数の名前です。一番下の要素(最高インデックスを持つ要素)は、「メイン」です。Shell関数を実行するときにのみ、この変数にのみ存在します。FUNCNAMEが無効に割り当てられ、エラー状態を返します。FUNCNAMEが設定されていない場合は、その後リセットしても、それはその特殊な性質を失うことになります。

この変数は、BASH_LINENOとBASH_SOURCEで使用することができます。各FUNCNAME BASH_SOURCE BASH_LINENOの要素とは、コールスタックに記載された要素に対応しています。例えば、ドキュメント$ {BASH_SOURCE [$ I + 1]}行番号から$ {BASH_LINENOは[$ i]は} $ {FUNCNAME [$ i]は}で呼ばれます。内蔵の発信者は、現在のコールスタックを表示するには、この情報を使用します。

[出典:バッシュマニュアル]


ハウス#10

ビル・ヘルナンデスへの情報のおかげ。私は採用され、いくつかの設定を追加しました。

#!/bin/bash
function Usage(){
    echo " Usage: show_parameters [ arg1 ][ arg2 ]"
}
[[ ${#2} -eq 0 ]] && Usage || {
    echo
    echo "# arguments called with ---->  ${@}     "
    echo "# \$1 ----------------------->  $1       "
    echo "# \$2 ----------------------->  $2       "
    echo "# path to me --------------->  ${0}     " | sed "s/$USER/\$USER/g"
    echo "# parent path -------------->  ${0%/*}  " | sed "s/$USER/\$USER/g"
    echo "# my name ------------------>  ${0##*/} "
    echo
}

乾杯


ハウス#11

そのようなもの?

export LC_ALL=en_US.UTF-8
#!/bin/bash
#!/bin/sh

#----------------------------------------------------------------------
start_trash(){
ver="htrash.sh v0.0.4"
$TRASH_DIR  # url to trash $MY_USER
$TRASH_SIZE # Show Trash Folder Size

echo "Would you like to empty Trash  [y/n]?"
read ans
if [ $ans = y -o $ans = Y -o $ans = yes -o $ans = Yes -o $ans = YES ]
then
echo "'yes'"
cd $TRASH_DIR && $EMPTY_TRASH
fi
if [ $ans = n -o $ans = N -o $ans = no -o $ans = No -o $ans = NO ]
then
echo "'no'"
fi
 return $TRUE
} 
#-----------------------------------------------------------------------

start_help(){
echo "HELP COMMANDS-----------------------------"
echo "htest www                 open a homepage "
echo "htest trash               empty trash     "
 return $TRUE
} #end Help
#-----------------------------------------------#

homepage=""

return $TRUE
} #end cpdebtemp

# -Case start
# if no command line arg given
# set val to Unknown
if [ -z $1 ]
then
  val="*** Unknown  ***"
elif [ -n $1 ]
then
# otherwise make first arg as val
  val=$1
fi
# use case statement to make decision for rental
case $val in
   "trash") start_trash ;;
   "help") start_help ;;
   "www") firefox $homepage ;;
   *) echo "Sorry, I can not get a $val   for you!";;
esac
# Case stop

ハウス#12

#------------- ------------- SCRIPT#
 
#!/bin/bash

echo
echo "# arguments called with ---->  ${@}     "
echo "# \$1 ---------------------->  $1       "
echo "# \$2 ---------------------->  $2       "
echo "# path to me --------------->  ${0}     "
echo "# parent path -------------->  ${0%/*}  "
echo "# my name ------------------>  ${0##*/} "
echo
exit

#------------- ------ CALLED -------# 
注意事項次の行に、最初の引数は、二重、内と呼ばれ
、それは二つの単語が含まれているため、#および単一引用符$ /misc/shell_scripts/check_root/show_parms.shを「『こんにちは』」 " 'ウィリアム'" 
#------------- ------------- RESULTS# と呼ばれる引数---> 'こんにちは' 'ウィリアム
# $ 1 ----------------------> 'こんにちは' 
$ 2件-------------------- - > 'ウィリアム' 
私には#パス--------------> /misc/shell_scripts/check_root/show_parms.sh 
#親パス------------ - > / miscの/ shell_scripts / check_root 
#私の名前-----------------> show_parms。shがある
#の#------------- ------------- END





ハウス#13

日時:Tanktalus上記(受け入れた)答えは、よりシンプルなアプローチは、使用することです。

me=$(readlink --canonicalize --no-newline $0)

別のスクリプトからあなたのbashスクリプトがあれば、あなたが使用することができます。

me=$(readlink --canonicalize --no-newline $BASH_SOURCE)

私はあなたの目標は、ユーザーにフィードバックを提供することであるならば間接参照シンボリックリンクが混乱し、同意するが、時にはあなたは、芋の最良の方法であるスクリプトやその他の文書、の正規名を取得する必要があります。


ハウス#14

あなたは、シェルスクリプトを呼び出すために好きなら

/home/mike/runme.sh

$ 0が完全な名前です

 /home/mike/runme.sh

ベース名$ 0ベースのファイル名を取得します

 runme.sh

そして、あなたは、このベース名と同様の変数を配置する必要があります

filename=$(basename $0)

そして、他のテキストを追加

echo "You are running $filename"

だからあなたのスクリプトは次のようです

/home/mike/runme.sh
#!/bin/bash 
filename=$(basename $0)
echo "You are running $filename"

ハウス#15

echo "$(basename "`test -L ${BASH_SOURCE[0]} \
                   && readlink ${BASH_SOURCE[0]} \
                   || echo ${BASH_SOURCE[0]}`")"

ハウス#16

bashそれを使用でき$0、スクリプトファイル名を取得します。一般的に$1$2および他のパラメータは、CLIにアクセスするために使用されます。同様に、$0スクリプト(スクリプトファイル名)のトリガ名にアクセスするため。

#!/bin/bash
echo "You are running $0"
...
...

あなたがいる場合/path/to/script.sh好きな/path/to/script.shスクリプトを呼び出すために、$0それはまた、パスとファイル名を提供します。このケースでは、必要な$(basename $0)だけ、スクリプトファイル名を取得します。


ハウス#17

コメントのいくつかは、拡張子なしのファイル名を疑問視しているので、そのため、次のように表示がこれを行う方法の例です:

FileName=${0##*/}
FileNameWithoutExtension=${FileName%.*}

お楽しみください!


ハウス#18

これは私がに基づくものですDimitre Radoulovの答え(ちなみに、私は同意する)インスピレーションが来るで。

script="$BASH_SOURCE"
[ -z "$BASH_SOURCE" ] && script="$0"

echo "Called $script with $# argument(s)"

あなたがスクリプトを呼び出す方法をどんなに

. path/to/script.sh

若しくは

./path/to/script.sh

ハウス#19

ではmy_script.sh簡単に、明確かつシンプル

#!/bin/bash

running_file_name=$(basename "$0")

echo "You are running '$running_file_name' file."

出力:

./my_script.sh
You are running 'my_script.sh' file.

ハウス#20

DIRECTORY=$(cd `dirname $0` && pwd)

私は、別のスタックオーバーフローの問題から来たんだ上記されているbashのスクリプトは、それがここで行うには、ディレクトリに格納されて伝えることができますか?、しかし、私は、それはまた、このトピックに便利だと思います。


ハウス#21

スクリプトの調達では、$BASH_SOURCE正しい答えを提供しています。

しかし、これはパスを含み、そのためだけのスクリプトファイル名、使用し得ます:

$(basename $BASH_SOURCE) 

ハウス#22

記載された条件への答えは正しいですが、あなたは別のスクリプトからスクリプトを実行するために「ソース」キーを使用する場合、問題がまだ存在する(それは同じハウジング内で実行されること)。この場合は、スクリプト$ 0を呼び出すために取得します。この場合、私はそれがスクリプト自体の名前を取得することはできませんと思います。

これは極端なケースで、それはあまりにも真剣にそれを取るべきではありません。直接、別のスクリプトから(「ソース」なしでは)スクリプトを実行する場合は、$ 0使用することができます。


ハウス#23

使用して、bashの> = 3効果的に、次の作業:

$ ./s
0 is: ./s
BASH_SOURCE is: ./s
$ . ./s
0 is: bash
BASH_SOURCE is: ./s

$ cat s
#!/bin/bash

printf '$0 is: %s\n$BASH_SOURCE is: %s\n' "$0" "$BASH_SOURCE"
オリジナルの記事は、0公表 ウォンの賞賛0 ビュー2223

おすすめ

転載: blog.csdn.net/p15097962069/article/details/103909823