0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

curl -sf (address.sh) | sh -sで(address.sh)に書いたecho $0の結果が知りたかった

Last updated at Posted at 2021-12-25

結論

パイプで実行したshが返されます。
たとえば、タイトルのように(略) | sh -sだと、sh
これをbashとかzshに変えたらそれぞれの結果になりました。

検証用URL(curlで呼び出せます)

検証用URL.sh(r_and_d.sh)
# curlで実行された場合に何を出力するか検証
echo $0

検証用URL(r_and_d.sh)

※普段からブランチや場合によりリポジトリをいじっているので、動かなくなったら↑の内容をご自身の環境において試してみてください。

ログインシェルで実行.sh
curl -sf https://raw.githubusercontent.com/shimajima-eiji/Settings_Environment/%2314_20211225_ver1_brew_upgrade_sh/for_Mac/r_and_d.sh | sh -s

補足

当然ですが、ファイルをローカルに保存して、ローカルから呼び出すと$0は「ファイル名」になります。
shだろうがbashだろうがzshだろうがファイル名です。

補足の補足

試しに、which shの結果である/bin/shで実行したところ、結果は/bin/shになりました。

curl_$0.sh
curl -sf https://raw.githubusercontent.com/shimajima-eiji/Settings_Environment/%2314_20211225_ver1_brew_upgrade_sh/for_Mac/r_and_d.sh | /bin/sh -s

これもbashのフルパス、zshのフルパスに変えてもそれぞれ同様の結果です。

疑問、そして理解したこと

これは質問に投稿するべきだと思ったのですが、記事を分けると上記を説明する必要があるので気付いた有識者の方に見てもらえればと思います。

$0とはそもそもなんなのか?

私は「スクリプトを実行しているもの(名前)が格納されている」という認識をしていました。
なので、

  • shで実行すればshが、
  • /bin/shで実行すれば/bin/shが
  • ファイル名から呼び出せばファイル名が

それぞれに入っているという認識です。

今回の場合、curlでファイルを文字列として受け取って、それをパイプ先に渡しているだけなので、実体はパイプで指定したものなんだろうという認識をしました。
これは、例えばログインシェル(対話モード)でecho $0を実行した時の結果がそのまま出ている($SHELLと同じはず)ので、同じことがcurl... | shにも起こっただけなんだろうという理解です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?