1. 概要

便宜上、現在のフォルダを変更するシェルスクリプトを実行したい場合があります。 たとえば、 / var / log フォルダーに頻繁にアクセスし、そこにすばやく移動したい場合は、Bashスクリプトを作成してそれを行うことができます。

このチュートリアルでは、cdコマンドを使用してこれを実現する方法を見ていきます。 その過程で、cdの動作の複雑さをいくつか見ていきます。

2. 一般的な問題

/ var /logディレクトリに移動することから始まるスクリプトから始めましょう。 これをvarlog.shと呼びます。

#!/usr/bin/env bash
# Filename: varlog.sh
cd /var/log
pwd
echo $$

ここでの考え方は、 / var / log に移動し、現在のフォルダーを表示して変更されたことを確認し、最後に実行中のシェルのプロセスIDを表示することです。

ただし、varlog.shを実行するときに発生する主な制限を理解しましょう。

$ ./varlog.sh
/var/log
29903

ご覧のとおり、スクリプトを実行すると、期待どおりに / var /logの出力とシェルのプロセスIDが得られます。

次に、スクリプトを実行した後、現在どのフォルダーにあるかを見てみましょう。

$ pwd
/home/baeldung

現在のフォルダが/var/ logに変更されていないため、これは私たちが期待していたものではありません。では、なぜこれが発生したのでしょうか。

シェルのプロセスIDを確認しましょう。

$ echo $$
28285

現在使用しているシェルのプロセスID(PID 28285 )とシェルスクリプトのプロセスID(PID 29903 )が異なることがわかります。

これは、Bashスクリプトが別の独立したシェルで実行されていることを意味します。 この個別のシェルはスクリプトの最後で終了し、親シェル(現在のシェル)は影響を受けません。

次のセクションでは、この問題を克服する方法についていくつかのアプローチを見ていきます。

3. 同じプロセスでのBashスクリプトの実行

現在のシェルと同じプロセスでスクリプトを実行するには、sourceコマンドを使用できます。 この組み込みコマンドには、(ドット)を使用した短い形式もあります。

まず、sourceコマンドのヘルプを調べてみましょう。

$ source --help
source: source filename [arguments]
Execute commands from a file <strong>in the current shell</strong>.
....

すごい! したがって、別のBashプロセスを開始せずに、現在のプロセスでBashスクリプトを実行できます。

それを試してみましょう:

$ source varlog.sh
/var/log
28285

また、現在のフォルダが変更されていることを確認しましょう。

$ pwd
/var/log

良い! したがって、 source を使用して、現在のシェルでシェルスクリプトを実行できることを示しました。

または、短い形式の表記を使用することもできます。

$ . varlog.sh
/var/log
28285

注:Bashスクリプトが実行されるのではなく、ソースされることを目的としている場合。 #などのコメントで示すことをお勧めします。このファイルのソースはの上部にある必要があります。

4. Bash関数

すべてのフォルダにBashスクリプトを作成するのは面倒です。 代わりに、1つのスクリプト内に複数のBash関数を記述できます。

# Filename: folders.sh
# This file should be sourced

function varlog() {
    cd "/var/log"
}

function tmp() {
    cd "/tmp"
}

ここで、ファイルを入手すると、次のようになります。

$ source folders.sh

現在のターミナルで、そのスクリプト内の関数を使用できます。

$ tmp
$ pwd
/tmp
$ varlog
$ pwd
/var/log

5. エイリアス

組み込みのaliasコマンドを使用すると、Bash関数をさらに改善できます。 alias は、通常、入力が少なくて済むため、関数よりも使いやすくなっています。

関数をエイリアスバリアントに変換してみましょう。

# Filename: folders.sh
# This file should be sourced

alias varlog="cd /var/log"
alias tmp="cd /tmp"

以前に作成したbash関数と比較すると、これがどれほど簡潔であるかがわかります。 それに加えて、関数を使用したのと同じ方法でエイリアスを使用できます。

$ unset -f varlog
$ unset -f tmp
$ source folders.sh
$ varlog
$ pwd
/var/log
$ tmp
$ pwd
/tmp

この一連のコマンドでは、 unset を使用して環境から関数を削除し、同等のエイリアスに置き換えました。 これは、エイリアスを含むfolders.shsourceを使用することで実現されます。

便宜上、.bash_profilesource folders.shを実行することもできます。 これにより、エイリアスをセッションに保持できます。

6.  zユーティリティの使用

z は、最近頻繁にアクセスしたフォルダーの記録を保持するユーティリティです。 Bashスクリプトを作成する代わりに、zを使用して作業を自動的に行うことができます。

z はLinuxにプリインストールされていないため、インストールする必要があります。 z ダウンロードをインストールしてからソース.bashrcファイルにインストールするには:

source <location of z>/z.sh

これを試すために、cdを使用してさまざまなフォルダをナビゲートしてみましょう。

$ cd ~/Downloads
$ cd ~/Music
$ cd /var/log
$ cd ~
$ z
29859      /home/user/Music
29868      /var/log
59694      /home/user/Downloads

z を呼び出した後、アクセスしたフォルダーのリストを取得する方法に注目してください。 フルパスを入力せずに特定のフォルダに移動するには、cdの代わりにzを使用してみましょう。

$ cd ~
$ z log
$ pwd
/var/log

パス全体を入力する必要がないため、特定の場所への移動がはるかに高速であることがわかります。 z logと入力することにより、 z/var /logcdすることができました。  これは、これがlogに一致する最も頻繁にアクセスされるディレクトリであるためです。

7. 結論

このチュートリアルでは、Bash内からcdコマンドを使用するいくつかの方法を見てきました。 まず、シェルスクリプトの実行は、独自の独立したプロセスで直接実行されることを学びました。

これを克服するために、現在のプロセスでシェルスクリプトを実行できるsourceコマンドを試してみました。 次に、関数とエイリアスコマンドを使用してBashスクリプトを改善する方法を検討しました。 最後に、 z というユーティリティを調べました。これにより、さまざまなフォルダにすばやく移動できます。