「シェルスクリプトの基礎 - パスの取得」の版間の差分

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == ここでは、シェルスクリプトで相対パスと絶対パスを取得する方法を記載する。<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>
特殊変数$0には、現在実行しているシェルスクリプトの相対パスが格納されて、<code>dirname</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/develop/test.shに存在する時、<br>
  <source lang="sh">
このシェルスクリプトを/home/usernameディレクトリから実行すると、以下のように相対パスが出力される。<br>
  <syntaxhighlight lang="sh">
  #!/bin/sh
  #!/bin/sh
   
   
15行目: 18行目:
  echo `dirname $0`
  echo `dirname $0`
  echo `basename $0`
  echo `basename $0`
  </source>
   
<br>
# 出力
これを、ホームディレクトリ/home/usernameから実行すると次の結果になる。<br>
  develop/test.sh  # $0の結果
  develop/test.sh  $0 の結果
  develop          # dirname $0の結果
  develop          dirname $0 の結果
  test.sh          # basename $0の結果
  test.sh          basename $0 の結果
</syntaxhighlight>
<br><br>
<br><br>


== 絶対パスの取得 ==
== 絶対パスの取得 ==
絶対パスを取得する場合、まず、<code>pwd</code>コマンド(環境変数$PWDを使用しても同じ)でシェルスクリプトを実行したディレクトリのパスを取得して、<code>cd dirname $0</code>で絶対パスを取得する。<br>
絶対パスを取得する手順を以下に記載する。<br>
cdを使用してディレクトリを移動した後、pwdで絶対パスを取得している。($(コマンド)または`コマンド`のコマンド置換を忘れないこと)<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>
  <source lang="sh">
また、コマンド置換はサブシェルで実行されるため、元の環境には影響を与えない。<br>
<br>
  <syntaxhighlight lang="sh">
  #!/bin/sh
  #!/bin/sh
   
   
  echo $(cd $(dirname $0) && pwd)
  echo $(cd $(dirname $0) && pwd)
  </source>
   
<br>
  # 実行
  # 実行
  sh develop/test.sh
  sh develop/test.sh
   
   
  # 出力
  # 出力
  /home/username/develop  $(cd $(dirname $0) && pwd)の結果
  /home/username/develop  # $(cd $(dirname $0) && pwd)の結果
</syntaxhighlight>
<br>
<br>
※注意<br>
<u>※注意</u><br>
cdを使用する場合は、以下の内容に気を付けること。<br>
<u><code>cd</code>コマンドを使用する場合は、以下のコマンド置換に注意すること。</u><br>
  <source lang="sh">
  <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`  
 
 # あとは好きな処理を記述していく
 ...