が.bash_profile
あり、その点でエイリアスのセットがあります。現時点では、これらのエイリアスは1つのコマンドのみを実行し、非常に簡単でした。ただし、作成しようとしている新しいエイリアスを使用して2つのことを行いたいと思います。
- ディレクトリへのCD
- そのディレクトリからコマンドを実行します
が.bash_profile
あり、その点でエイリアスのセットがあります。現時点では、これらのエイリアスは1つのコマンドのみを実行し、非常に簡単でした。ただし、作成しようとしている新しいエイリアスを使用して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
これにより、ルートディレクトリの「長い形式」のディレクトリリストが提供されます。
シェル関数は最初の引数を取り、そのディレクトリへの変更を試みます。それが機能する場合、ディレクトリ名を位置パラメータ(コマンドライン引数リスト)からシフトし、残りの引数で指定されたコマンドを実行します。command
は、単にコマンドとして引数を実行するシェルの組み込みコマンドです。
変更された作業ディレクトリでコマンドを実行する場合は、これらすべてが必要です。他の場所にあるコマンドを実行するだけの場合は、明らかに使用できます
alias thing='$HOME/somedir/script.sh'
しかし、これは実行しますscript.sh
に位置$HOME/somedir
して、現在の作業ディレクトリとしてディレクトリ。
作業ディレクトリを変更せずに他の場所にあるスクリプトを実行する別の方法は、PATH
環境変数にスクリプトの場所を追加することです。例えば
PATH="$PATH:$HOME/somedir"
これscript.sh
で、$HOME/somedir
使用するだけでどこからでも実行できるようになります
$ script.sh
繰り返しますが、これはコマンドの作業ディレクトリを変更しません。
{ ... }
ただし、より長い機能との一貫性のために常に使用しています。
pushd
および出力メッセージも回避しようとしている場合)を使用することで改善される可能性があります!popd
> /dev/null
(cd dir && thing)
また、pushd
and を使用するよりもはるかに移植性がありpopd
ます。
この関数を使用して、別のディレクトリで単一のコマンドを実行します。
cd1 () {
if [ $# -eq 1 ]; then
command cd -- "$1"
else
( command cd -- "$1" && shift && "$@" )
fi
}
この機能の制限は、コマンドが実行されるディレクトリではなく、元のディレクトリに関連してワイルドカードが完了することです。zshの方がうまくいく可能性があります。
この関数はcd
、単一の引数で呼び出された場合、通常のように機能するため、呼び出すことができcd
ます。(この関数はオプションをサポートしていませんが、オプションcd
はほとんど使用されません。)
コマンドをセミコロンで区切ります。例:
alias do_something='cd /tmp; ls'
cd
失敗した場合、間違ったディレクトリのディレクトリ一覧を取得します。ここの&&
代わりに使用することをお勧めします;
。
cdrun () ( cd "$1" && shift && command "$@" )
。