web-dev-qa-db-ja.com

エイリアスのパスを動的に変更するにはどうすればよいですか?

パスを使用する.cshrcファイルに多数のエイリアスがあります。

/projects/project_name/my_name/$CLIENT

作業ディレクトリパスからフォルダー名を取得し、さまざまなエイリアスで使用される環境変数に保存することを目的とした短いスクリプトを作成しました。

set client_name = `echo $PWD | awk -F / '{ print $5; }' | xargs`

setenv CLIENT $client_name  

source ~/.cshrc   

現在の問題は、これが実行されたときに環境変数が以前の値から更新されないことです。残念ながら、Cシェルは、Bashでできるような関数(潜在的な代替方法)の使用をサポートしていません。

コマンドラインから更新する変数を取得するにはどうすればよいですか?これを達成するためのより良い方法はありますか?

ありがとう

2
tombam95

最後に、私の解決策は、スクリプトを使用して$CLIENT変数をエイリアスに挿入します。

例:

作成find_client.sh、およびecho $PWD | awk -F / '{ print $5; }' | xargsメソッドを使用して、このスクリプト内でクライアントディレクトリを検索します。フルパスを付けて出力をエコーし​​ます。

私のエイリアス(.cshrc file)次のようなエイリアスを作成します。

alias wk 'cd `find_client.sh`'

これまでのところ、これは期待どおりに動作するようです。

0
tombam95

作業ディレクトリパス(pwd)に5つの変数がないため、スクリプトが_$5_に空の文字列を配置している可能性がありますが、入力文字列がないとわかりません。この問題についてさらにヘルプが必要な場合は、質問をより多くの情報で更新し、awkに送信される入力がどのように見えるかを示す必要があります。

エイリアスを動的にする方法があるかどうかはわかりませんが、各エイリアスを単純にbash関数に変換できます。 bash関数はfunct_name () {commands}の形式を取り、変数_$1_、_$2_、_$3_、...などに格納される引数も受け取ります。したがって、動的データを引数として読み込むbash関数を作成できます。例えば:

_test () {
  echo $1
}
_

次のように動作します。

_$ test abc
abc
$ test foobar
foobar
_

この方法では、エイリアスコマンドを使用して、echoが私の例では_$1_ではなく_$CLIENT_を使用する場所に配置します。ただし、各エイリアスをbash関数として再作成し、このように引数を使用するhaveさえもしません。

あなたが私に与えたサンプルコマンドから、作業ディレクトリパスからフォルダー名を取得し、それを環境変数に格納してさまざまなエイリアスで使用しているようです。このタスクを実行するbash関数を作成するだけです。ここでの例は、作業ディレクトリのパスを取得するbash関数です。firstフォルダー名を見つけます(4番目が必要なので、 this)、それを_$TEST_環境変数に保存します。

_test () {
  var=$(pwd | awk -F / '{ print $2; }')
  export TEST=$var
}
_

この関数を常に使用できるようにするには、上記を_.bashrc_ファイルに追加します。新しいターミナルウィンドウを開始するときはいつでも、testコマンドを自由に使用できます。 (新しいものを開く必要がなく)現在の作業端末に追加したい場合は、_source ~/.bashrc_を実行します。その後、コマンドのようにターミナルで関数を実行できます。 testを実行すると、環境変数が更新され、エイリアスコマンドが機能するようになります。これが動作中の例です:

_$ pwd
/home/user
$ echo $TEST

$ test
$ echo $TEST
home
_

注意:このコマンドは作業しているディレクトリによって異なります。フォルダーをルートに変更すると、最初の直後に文字列がないため、この例では_$TEST_に空の文字列を配置します。スラッシュ。これがawkがあなたのケースで空の文字列を出力している理由かもしれませんが、繰り返しますが、入力データを見ない限り、私は確かに言うことはできません。

1
ExecutionByFork

ディレクトリを変更するたびに$CLIENT変数を更新するエイリアスをcdに追加することを検討してください。

alias cd 'cd \!*; set client_name = `echo $PWD | awk -F / '\''{ print $5; }'\'' | xargs`; setenv CLIENT $client_name'

もちろん、これには欠点があります。たとえば、pushdpopdでは機能しませんが、同様のエイリアスを使用すると回避できる可能性があります。私が十分に考慮しなかった他のコーナーケースがあるかもしれません。

また、cshrcファイルに保持するエイリアスが実際にneedであるかどうかも検討してください。 (変数の設定やディレクトリの変更によって)何らかの方法でシェル環境を変更しない限り、スタンドアロンのシェルスクリプトにすることができます。その場合、実際には、関数をサポートするシェルを使用してそれらを記述できます。

1
filbranden