自作コマンドでcdコマンドが使えない理由

この記事は、以前の記事の続きになります。

コマンド

そもそも、コマンドは、実行可能なプログラムまたはソースコードのことを指します。

ですので、普段から何気なく使っている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コマンドは、現在のシェルで実行します。