この記事は、以前の記事の続きになります。
コマンド
そもそも、コマンドは、実行可能なプログラムまたはソースコードのことを指します。
ですので、普段から何気なく使っているlsコマンドやmvコマンドなどもlsやmvという名前のプログラムになります。
(バイナリファイルなので、中身を見ようとするのは大変です。)
以上のことから、自分でもコマンドは作ることができます。
自作コマンドを作った際、シェルスクリプトをコマンドとして実行していました。(以前の記事参照)
#!/bin/bash
cp $1 $2
cd $2
上をファイルをコマンドとして実行させる場合は、コマンドラインでファイル名だけで実行させます。
$ cpcd hogehoge.txt ../hoge
ファイルをコマンドとして実行させる(インタープリター言語)場合、ファイルの1行目にどのコマンドで実行するか明記します。
明記する際、「#!」に続けて、実行するコマンドの絶対パスを表記しましょう。
自作コマンドの例の場合、「#!/bin/bash」がそれに該当します。
この1行目のことをshebang(シェバン)と呼びます。
これで、コンピューターは、このファイルは、このコマンドで実行するんだということが分かります。
このshebangがないとエラーメッセージが出ます。
新たなシェルで実行している
ファイルをコマンドとして実行する際、shebangが必要ということは、先ほど述べました。
自作コマンドの例の場合、bashコマンドで実行しています。その場合、新たなシェルで実行することになります。
また、bash cpcd も同様に新たなシェルで実行しています。
なぜcdコマンドが実行されないのか
新たなシェルで実行すると、プログラムの実行中では、新たなシェルで実行していますが、終了すると元のシェルに戻ってしまうからです。
実行されていないように見えているだけで、プログラムでは、cdコマンドは実行されています。
ファイルでcdコマンドを実行するためには
プログラム上でcdコマンドを使用したい場合、bashコマンドではなく、sourceコマンドを用いると実行されます。
なぜなら、sourceコマンドは、現在のシェルで実行されるからです。
実行例
$ source cpcd hogehoge.txt ../hoge
まとめ
ファイルをコマンドとして実行する場合、新たなシェルで実行するため、ディレクトリの移動はできません。
ディレクトリの移動がしたい場合、sourceコマンドで実行します。
sourceコマンドは、現在のシェルで実行します。