web-dev-qa-db-ja.com

ディレクトリのCDへのエイリアスとコマンドの呼び出し

.bash_profileそしてその中に私は一連のエイリアスを持っています。現時点では、これらのエイリアスは単一のコマンドのみを実行するため、かなり簡単でした。ただし、作成しようとしている新しいエイリアスで2つのことを実行したいと思います。

  1. ディレクトリにCD
  2. そのディレクトリからコマンドを実行します
23
user232103

特定の作業ディレクトリでコマンドを実行するには、通常、

( 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/somedircurrentディレクトリを作業ディレクトリとして実行します。

作業ディレクトリを変更せずに別の場所にあるスクリプトを実行する別の方法は、スクリプトの場所をPATH環境変数に追加することです。

PATH="$PATH:$HOME/somedir"

これで、script.sh$HOME/somedirを使用するだけでどこからでも実行できるようになります

$ script.sh

繰り返しますが、これはnotコマンドの作業ディレクトリを変更します。

27
Kusalananda
alias <name-of-the-alias>='cd <the-directory> && <command>'

したがって、ディレクトリ(cd)をフォルダー/var/log/に変更し、そのファイルをリスト(ls)したい場合は、次のように.bash_profileファイルに追加できます。

alias logs='cd /var/log/ && ls'
5
nikolas

この関数を使用して、別のディレクトリで単一のコマンドを実行します。

cd1 () {
  if [ $# -eq 1 ]; then
    command cd -- "$1"
  else
    ( command cd -- "$1" && shift && "$@" )
  fi
}

この関数の制限は、コマンドが実行されるディレクトリではなく、元のディレクトリを基準にしてワイルドカードが補完されることです。 zshでより良いことは可能です

この関数は、単一の引数を指定して呼び出された場合、通常のcdのように機能するため、cdと呼ぶことができます。 (この関数はオプションをサポートしていませんが、cdへのオプションはほとんど使用されません。)

コマンドはセミコロンで区切ります。例:

alias do_something='cd /tmp; ls'
0
John Elliot V