.bash_profile
そしてその中に私は一連のエイリアスを持っています。現時点では、これらのエイリアスは単一のコマンドのみを実行するため、かなり簡単でした。ただし、作成しようとしている新しいエイリアスで2つのことを実行したいと思います。
特定の作業ディレクトリでコマンドを実行するには、通常、
( cd directory && utility )
cd ...
を囲む括弧は、その中のコマンドがサブシェルで実行されることを意味します。サブシェルで作業ディレクトリを変更すると、呼び出し側シェルの現在の作業ディレクトリが変更されないようになります。つまり、このコマンドを呼び出した後も、起動したのと同じディレクトリにいることになります。
例:
( cd / && echo "$PWD" ) # will output "/"
echo "$PWD" # will output whatever directory you were in at the start
エイリアスは引数を取ることができないため、これを汎用エイリアスに変換することはできません。
特定ディレクトリとユーティリティの場合、
alias cdrun='( cd "$HOME/somedir" && ./script.sh )'
ただし、一般的なケースでは、シェル関数を使用する必要があります。
cdrun () {
( cd "$1" && shift && command "$@" )
}
または
cdrun () (
cd "$1" && shift && command "$@"
)
関数の本体を囲む中括弧を括弧で置き換えると、関数は独自のサブシェルで実行されます。
これは次のように使用されます
$ cdrun "$HOME/somedir" ./script.sh
スクリプトscript.sh
は、ディレクトリ$HOME/somedir
にあり、$HOME/somedir
を作業ディレクトリとして実行します。
$ cdrun / ls -l
これにより、ルートディレクトリの「長い形式」のディレクトリリストが提供されます。
Shell関数は最初の引数を取り、そのディレクトリに移動しようとします。それが機能する場合、ディレクトリ名を定位置パラメーター(コマンドライン引数リスト)からずらして、残りの引数で指定されたコマンドを実行します。 command
はシェルの組み込みコマンドで、引数をコマンドとして実行するだけです。
コマンドを実行したい場合は、これらすべてが必要です変更された作業ディレクトリで。他の場所にあるコマンドを実行したいだけなら、明らかに使用できます
alias thing='$HOME/somedir/script.sh'
しかし、これはscript.sh
にある$HOME/somedir
をcurrentディレクトリを作業ディレクトリとして実行します。
作業ディレクトリを変更せずに別の場所にあるスクリプトを実行する別の方法は、スクリプトの場所をPATH
環境変数に追加することです。
PATH="$PATH:$HOME/somedir"
これで、script.sh
の$HOME/somedir
を使用するだけでどこからでも実行できるようになります
$ script.sh
繰り返しますが、これはnotコマンドの作業ディレクトリを変更します。
alias <name-of-the-alias>='cd <the-directory> && <command>'
したがって、ディレクトリ(cd)をフォルダー/var/log/
に変更し、そのファイルをリスト(ls)したい場合は、次のように.bash_profile
ファイルに追加できます。
alias logs='cd /var/log/ && ls'
この関数を使用して、別のディレクトリで単一のコマンドを実行します。
cd1 () {
if [ $# -eq 1 ]; then
command cd -- "$1"
else
( command cd -- "$1" && shift && "$@" )
fi
}
この関数の制限は、コマンドが実行されるディレクトリではなく、元のディレクトリを基準にしてワイルドカードが補完されることです。 zshでより良いことは可能です 。
この関数は、単一の引数を指定して呼び出された場合、通常のcd
のように機能するため、cd
と呼ぶことができます。 (この関数はオプションをサポートしていませんが、cd
へのオプションはほとんど使用されません。)
コマンドはセミコロンで区切ります。例:
alias do_something='cd /tmp; ls'