一連のエイリアスがあるものがあります.bash_profile
。現在、これらのエイリアスは単一のコマンドのみを実行し、非常に簡単です。しかし、作成したい新しいエイリアスで実行したい2つのことがあります。
- CDをディレクトリに
- このディレクトリからコマンドを実行してください。
答え1
特定の作業ディレクトリを使用してコマンドを実行するには、通常、次のようにします。
( 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
これにより、ルートディレクトリの「長い形式」ディレクトリのリストが表示されます。
シェル関数は、最初の引数を使用してそのディレクトリに変更しようとします。有効な場合は、ディレクトリ名を場所引数(コマンドライン引数リスト)から離して、残りの引数が提供するコマンドを実行します。command
はシェルに組み込まれたコマンドなので、引数をコマンドとして実行します。
コマンドを実行するには、これらすべてが必要です。作業ディレクトリが変更されました。他の場所にあるコマンドを実行したい場合は、明らかに次のものを使用できます。
alias thing='$HOME/somedir/script.sh'
しかし、これは続くでしょscript.sh
う。$HOME/somedir
現在のディレクトリを作業ディレクトリとして使用します。
作業ディレクトリを変更せずに他の場所にあるスクリプトを実行するもう1つの方法は、スクリプトの場所をPATH
環境変数に追加することです。
PATH="$PATH:$HOME/somedir"
これで、次を使用script.sh
して$HOME/somedir
どこでも実行できます。
$ script.sh
繰り返しますが、これは本当ですいいえコマンドの作業ディレクトリを変更します。
答え2
alias <name-of-the-alias>='cd <the-directory> && <command>'
/var/log/
したがって、ディレクトリ(cd)をそのフォルダに変更してからそのファイルを一覧表示するには、次のファイルをファイルに追加します.bash_profile
。
alias logs='cd /var/log/ && ls'
答え3
この関数を使用して、別のディレクトリから単一のコマンドを実行します。
cd1 () {
if [ $# -eq 1 ]; then
command cd -- "$1"
else
( command cd -- "$1" && shift && "$@" )
fi
}
この機能の1つの制限は、コマンドが実行されるディレクトリではなく元のディレクトリに基づいてワイルドカードが実行されることです。zshはより良いことができます。。
単一の引数で呼び出すと、関数は通常の関数のように動作するため、cd
呼び出す必要がありますcd
。 (この機能はオプションをサポートしていませんが、cd
オプションはほとんど使用されません。)
答え4
たとえば、次のようにコマンドをセミコロンで区切ります。
alias do_something='cd /tmp; ls'