
を持っており.bash_profile
、その中にエイリアスのセットがあります。 現時点では、これらのエイリアスは 1 つのコマンドのみを実行するので、かなり簡単です。 ただし、作成しようとしている新しいエイリアスを使用して、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
、これは現在ディレクトリを作業ディレクトリとして使用します。
作業ディレクトリを変更せずに他の場所にあるスクリプトを実行する別の方法は、スクリプトの場所をPATH
環境変数に追加することです。例:
PATH="$PATH:$HOME/somedir"
これからはscript.sh
、$HOME/somedir
$ script.sh
繰り返しますが、これはないコマンドの作業ディレクトリを変更します。
答え2
alias <name-of-the-alias>='cd <the-directory> && <command>'
したがって、ディレクトリをフォルダーに変更 (cd) して/var/log/
、そのフォルダー内のファイルを一覧表示 (ls) したい場合は.bash_profile
、ファイルに次のコードを追加します。
alias logs='cd /var/log/ && ls'
答え3
この関数を使用して、別のディレクトリで単一のコマンドを実行します。
cd1 () {
if [ $# -eq 1 ]; then
command cd -- "$1"
else
( command cd -- "$1" && shift && "$@" )
fi
}
この機能の制限は、ワイルドカードが、コマンドが実行されるディレクトリではなく、元のディレクトリを基準にして完了することです。zshでもっと良い結果を出すことも可能。
この関数は、単一の引数で呼び出された場合、通常の のように動作するcd
ので、 を呼び出すとよいでしょうcd
。(この関数はオプションをサポートしていませんが、 のオプションはcd
ほとんど使用されません。)
答え4
コマンドはセミコロンで区切ります。例:
alias do_something='cd /tmp; ls'