パスを使用する.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でできるような関数(潜在的な代替方法)の使用をサポートしていません。
コマンドラインから更新する変数を取得するにはどうすればよいですか?これを達成するためのより良い方法はありますか?
ありがとう
最後に、私の解決策は、スクリプトを使用して$CLIENT
変数をエイリアスに挿入します。
例:
作成find_client.sh
、およびecho $PWD | awk -F / '{ print $5; }' | xargs
メソッドを使用して、このスクリプト内でクライアントディレクトリを検索します。フルパスを付けて出力をエコーします。
私のエイリアス(.cshrc
file)次のようなエイリアスを作成します。
alias wk 'cd `find_client.sh`'
これまでのところ、これは期待どおりに動作するようです。
作業ディレクトリパス(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
があなたのケースで空の文字列を出力している理由かもしれませんが、繰り返しますが、入力データを見ない限り、私は確かに言うことはできません。
ディレクトリを変更するたびに$CLIENT
変数を更新するエイリアスをcd
に追加することを検討してください。
alias cd 'cd \!*; set client_name = `echo $PWD | awk -F / '\''{ print $5; }'\'' | xargs`; setenv CLIENT $client_name'
もちろん、これには欠点があります。たとえば、pushd
やpopd
では機能しませんが、同様のエイリアスを使用すると回避できる可能性があります。私が十分に考慮しなかった他のコーナーケースがあるかもしれません。
また、cshrcファイルに保持するエイリアスが実際にneedであるかどうかも検討してください。 (変数の設定やディレクトリの変更によって)何らかの方法でシェル環境を変更しない限り、スタンドアロンのシェルスクリプトにすることができます。その場合、実際には、関数をサポートするシェルを使用してそれらを記述できます。