「シェルスクリプトの基礎 - パスの取得」の版間の差分
(ページの作成:「== 概要 == ここでは、シェルスクリプトで相対パスと絶対パスを取得する方法を記載する。<br> <br><br> == 相対パスの取得 == ディ…」) |
細 (文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag…) |
||
(同じ利用者による、間の1版が非表示) | |||
5行目: | 5行目: | ||
== 相対パスの取得 == | == 相対パスの取得 == | ||
ディレクトリの相対パスを取得するには、<code>dirname $0</code>を使用する。<br> | ディレクトリの相対パスを取得するには、<code>dirname $0</code>を使用する。<br> | ||
特殊変数$ | <br> | ||
特殊変数$0には、現在実行しているシェルスクリプトの相対パスが格納されており、<br> | |||
<code>dirname</code>コマンドは、引数に与えられたファイルのパスからディレクトリのパスを取得する。<br> | |||
逆に、<code>basename</code>コマンドはファイル名を取得することができる。<br> | 逆に、<code>basename</code>コマンドはファイル名を取得することができる。<br> | ||
<br> | <br> | ||
以下の例では、以下のシェルスクリプトが/home/username/develop/test.shに存在する時、<br> | |||
< | このシェルスクリプトを/home/usernameディレクトリから実行すると、以下のように相対パスが出力される。<br> | ||
<syntaxhighlight lang="sh"> | |||
#!/bin/sh | #!/bin/sh | ||
15行目: | 18行目: | ||
echo `dirname $0` | echo `dirname $0` | ||
echo `basename $0` | echo `basename $0` | ||
# 出力 | |||
develop/test.sh # $0の結果 | |||
develop/test.sh | develop # dirname $0の結果 | ||
develop | test.sh # basename $0の結果 | ||
test.sh | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
== 絶対パスの取得 == | == 絶対パスの取得 == | ||
絶対パスを取得する手順を以下に記載する。<br> | |||
<br> | |||
まず、<code>pwd</code>コマンド(環境変数$PWDを使用しても同じ)でシェルスクリプトを実行したディレクトリのパスを取得する。<br> | |||
<code>cd dirname $0</code>で絶対パスを取得する。<br> | |||
<br> | |||
次に、<code>cd</code>コマンドを使用してディレクトリを移動した後、<code>pwd</code>コマンドで絶対パスを取得する。<br> | |||
<code>$(コマンド)</code>または<code>`コマンド`</code>のコマンド置換を忘れないこと。<br> | |||
<br> | <br> | ||
< | また、コマンド置換はサブシェルで実行されるため、元の環境には影響を与えない。<br> | ||
<br> | |||
<syntaxhighlight lang="sh"> | |||
#!/bin/sh | #!/bin/sh | ||
echo $(cd $(dirname $0) && pwd) | echo $(cd $(dirname $0) && pwd) | ||
# 実行 | # 実行 | ||
sh develop/test.sh | sh develop/test.sh | ||
# 出力 | # 出力 | ||
/home/username/develop | /home/username/develop # $(cd $(dirname $0) && pwd)の結果 | ||
</syntaxhighlight> | |||
<br> | <br> | ||
※注意<br> | <u>※注意</u><br> | ||
<u><code>cd</code>コマンドを使用する場合は、以下のコマンド置換に注意すること。</u><br> | |||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/sh | #!/bin/sh | ||
53行目: | 62行目: | ||
# これ以降はcdされた状態で実行される | # これ以降はcdされた状態で実行される | ||
... | ... | ||
</source> | </syntaxhighlight> | ||
<br> | |||
また、以下のどの方法でも、カレントディレクトリの絶対パスを取得できる。<br> | |||
<syntaxhighlight lang="sh"> | |||
current_dir=$(pwd) | |||
current_dir="$PWD" | |||
current_dir=`pwd` | |||
</syntaxhighlight> | |||
<br><br> | |||
== 実行中のシェルスクリプトがあるディレクトリに移動する == | |||
シェルスクリプトの処理において、シェルスクリプトが配置されているディレクトリをカレントディレクトリとすることを前提として記述されている場合、<br> | |||
他のディレクトリにいる時、シェルスクリプト内のコマンドを実行することができなくなってしまう。<br> | |||
<br> | |||
このような場合、シェルスクリプトの先頭で、そのシェルスクリプトがあるディレクトリに移動するように記述すると、<br> | |||
どのディレクトリからでも実行できるスクリプトにすることができる。<br> | |||
<br> | |||
以下の例では、<code>dirname</code>コマンドを利用してカレントディレクトリを移動している。<br> | |||
シェルスクリプトは新しく起動したシェル内で実行されるため、このスクリプトを起動したシェルのカレントディレクトリが移動することはない。<br> | |||
<br> | |||
<u>ただし、<code>source</code>コマンドで起動した場合はカレントディレクトリが移動するので、注意すること。</u><br> | |||
<syntaxhighlight lang="sh"> | |||
#!/bin/sh | |||
# シェルスクリプトのあるディレクトリへ移動 | |||
cd `dirname $0` | |||
# あとは好きな処理を記述していく | |||
... | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
{{#seo: | |||
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki | |||
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 | |||
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux | |||
|image=/resources/assets/MochiuLogo_Single_Blue.png | |||
}} | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:シェルスクリプト]] | [[カテゴリ:シェルスクリプト]] |
2024年10月14日 (月) 10:38時点における最新版
概要
ここでは、シェルスクリプトで相対パスと絶対パスを取得する方法を記載する。
相対パスの取得
ディレクトリの相対パスを取得するには、dirname $0
を使用する。
特殊変数$0には、現在実行しているシェルスクリプトの相対パスが格納されており、
dirname
コマンドは、引数に与えられたファイルのパスからディレクトリのパスを取得する。
逆に、basename
コマンドはファイル名を取得することができる。
以下の例では、以下のシェルスクリプトが/home/username/develop/test.shに存在する時、
このシェルスクリプトを/home/usernameディレクトリから実行すると、以下のように相対パスが出力される。
#!/bin/sh
echo $0
echo `dirname $0`
echo `basename $0`
# 出力
develop/test.sh # $0の結果
develop # dirname $0の結果
test.sh # basename $0の結果
絶対パスの取得
絶対パスを取得する手順を以下に記載する。
まず、pwd
コマンド(環境変数$PWDを使用しても同じ)でシェルスクリプトを実行したディレクトリのパスを取得する。
cd dirname $0
で絶対パスを取得する。
次に、cd
コマンドを使用してディレクトリを移動した後、pwd
コマンドで絶対パスを取得する。
$(コマンド)
または`コマンド`
のコマンド置換を忘れないこと。
また、コマンド置換はサブシェルで実行されるため、元の環境には影響を与えない。
#!/bin/sh
echo $(cd $(dirname $0) && pwd)
# 実行
sh develop/test.sh
# 出力
/home/username/develop # $(cd $(dirname $0) && pwd)の結果
※注意
cd
コマンドを使用する場合は、以下のコマンド置換に注意すること。
#!/bin/sh
echo $(cd $(dirname $0) && pwd)
# これ以降もcdされてない状態で実行される
...
cd $(dirname $0)
echo pwd
# これ以降はcdされた状態で実行される
...
また、以下のどの方法でも、カレントディレクトリの絶対パスを取得できる。
current_dir=$(pwd)
current_dir="$PWD"
current_dir=`pwd`
実行中のシェルスクリプトがあるディレクトリに移動する
シェルスクリプトの処理において、シェルスクリプトが配置されているディレクトリをカレントディレクトリとすることを前提として記述されている場合、
他のディレクトリにいる時、シェルスクリプト内のコマンドを実行することができなくなってしまう。
このような場合、シェルスクリプトの先頭で、そのシェルスクリプトがあるディレクトリに移動するように記述すると、
どのディレクトリからでも実行できるスクリプトにすることができる。
以下の例では、dirname
コマンドを利用してカレントディレクトリを移動している。
シェルスクリプトは新しく起動したシェル内で実行されるため、このスクリプトを起動したシェルのカレントディレクトリが移動することはない。
ただし、source
コマンドで起動した場合はカレントディレクトリが移動するので、注意すること。
#!/bin/sh
# シェルスクリプトのあるディレクトリへ移動
cd `dirname $0`
# あとは好きな処理を記述していく
...