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


21

.bash_profileあり、その点でエイリアスのセットがあります。現時点では、これらのエイリアスは1つのコマンドのみを実行し、非常に簡単でした。ただし、作成しようとしている新しいエイリアスを使用して2つのことを行いたいと思います。

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

回答:


26

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

( 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
優れた包括的な答え。関数定義にはコマンドをグループ化する方法が1つだけ必要であり、サブシェルのかっこで十分であることに言及したいと思いましたcdrun () ( cd "$1" && shift && command "$@" )
アンソニーG-モニカの正義

2
@AnthonyGeogheganああ、それは本当です。{ ... }ただし、より長い機能との一貫性のために常に使用しています。
クサラナナンダ

このQ&Aは私の状況を物語っているようで、コンテキストをクリーンに保ちながら、周囲の(pushdおよび出力メッセージも回避しようとしている場合)を使用することで改善される可能性があります!popd> /dev/null
ピシス

1
@Pysisはい、(cd dir && thing)また、pushdand を使用するよりもはるかに移植性がありpopdます。
クサラナナンダ

@Kusalananda本当に?少なくともいくつかのシステムで動作するようにしました。
Pysis

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

そのため、ディレクトリをディレクトリに変更(cd)してから/var/log/そのファイルをリスト(ls)したい場合は、.bash_profileファイルに以下を追加できます。

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

1

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

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

この機能の制限は、コマンドが実行されるディレクトリではなく、元のディレクトリに関連してワイルドカードが完了することです。zshの方がうまくいく可能性があります

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


-1

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

alias do_something='cd /tmp; ls'

8
cd失敗した場合、間違ったディレクトリのディレクトリ一覧を取得します。ここの&&代わりに使用することをお勧めします;
クサラナナンダ

@Kusalanandaは正しい。あなたはこの答えで
-nikolas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.