問題が何なのかわからないようです。これはデフォルト設定(bash、gnomeなど...)があるFedora 37にあります。
私が達成したいのは、仮想環境のフォルダ名が現在の作業ディレクトリの名前(たとえばpython3 -m venv $cwd
)であるPython仮想環境を作成するためのエイリアスを作成することです。
これは、特にvenvを有効にしたとき(そして後でプロジェクト間でディレクトリを切り替えるとき)、どのvenvが有効になっているかを簡単に識別できる場合に便利です。
しかし、奇妙な理由で、これは期待どおりに機能しません。複雑なエイリアスを作成した経験はあまりありませんが、まだ存在していることを覚えておくことが重要です。次の変数を作成しました.bashrc
。
export cwd="pwd | rev | cut -d '/' -f1 | rev"
test
端末でこれを実行すると、期待どおりにディレクトリ名が表示されますが、端末$cwd
で実行すると、次のような結果が表示されます。home/<USERNAME>/Projects/VueJS/test
export cwd2="${PWD##*/}"
- 何らかの理由でこれは私のユーザー名だけを表示します。 stackoverflowで検索しました。これは現在のディレクトリ名を取得する提案された方法の1つです。
始める方法や情報を見つけることができる場所についていくつかのアドバイスをいただきありがとうございます。複数のソースを検索してみましたが、不明のようです。二重引用符と一重引用符の間に違いがあることをどこかで読みましたが、その理由とこれがこの動作に影響するかどうかはわかりません。
編集:明確にするためにエイリアスを実行したいのは次のとおりです。
python3 -m venv <CURRENT_DIRECTORY_NAME> && source <CURRENT_DIRECTORY_NAME>/bin/activate && [ ! -f ./requirements.txt ] || pip install -r requirements.txt
- Pythonプロジェクトのダミープロジェクトが作成されます。
python3 -m venv <CURRENT_DIRECTORY_NAME> && source <CURRENT_DIRECTORY_NAME>/bin/activate && pip install nodeenv && nodeenv -p
- これは、Python venvに依存するnodejsに依存するプロジェクト用の仮想環境を作成します。
答え1
何が間違っていますか$cwd
?
cwd="pwd | rev | cut -d '/' -f1 | rev"
thenを使用すると、$cwd
実際にはpwd
引数を使用して実行されます(出力をパイプしません)。デフォルトでは、次のようなことを実行しています。
pwd '|' rev '|' cut '-d' "'/'" '-f1' '|' rev
pwd
オプション以外の引数は無視されるため、エラーは表示されません。組み込み/bin/pwd
の代わりに使用する場合は、次のメッセージが表示されます。pwd
$> /bin/pwd '|'
#Output
/bin/pwd: ignoring non-option arguments
次の簡単な方法を使用してこの動作をテストできますscript.sh
。
#! /usr/bin/env bash
printf "I got: %s\n" "$@"
実行権限が次のように設定されていることを確認してください。script.sh
それでは、次のcwd
ように変更してください。
cwd="./script.sh | rev | cut -d '/' -f1 | rev"
そして、以下を実行してください$cwd
:
(shell)> $cwd
#Output
I got: |
I got: rev
I got: |
I got: cut
I got: -d
I got: '/'
I got: -f1
I got: |
I got: rev
上記のように、スクリプトは./script.sh
パラメータとして渡されるため、実際に値を取得するためパイプされません。
変数に格納されている内容を実際にパイプするには、次のように$cwd
使用する必要があります。eval
eval $cwd
#Output:
test
functions
文字列を使用してコマンドを実行する代わりに、次のことをお勧めします(この問題を回避できます)。
getBaseName() {
pwd | rev | cut -d '/' -f1 | rev
}
getBaseName
#Output:
test
ところで、あなたが望むもの(単にテストを印刷するだけ)は、次のコマンドを使用して達成できますbasename
。
basename $(pwd)
#Output:
test
注文情報これにエイリアスを作りたいです。もう一度申し上げますが、関数を使用することをお勧めします。 (私の考えでは、短くても複雑ではないコマンドにはエイリアスを使用する必要があります。)
したがって、両方のスクリプトの関数を作成できます。また、aでは現在のディレクトリを参照するため、.
asを使用することをお勧めします。この出力を渡すと、現在のパスではなく現在のパスにない可能性があるディレクトリを参照します。<CURRENT_DIRECTORY_NAME>
.
$cwd
上記で私が意味するのは、あなたがこのルートにいる場合:
home/<USERNAME>/Projects/VueJS/test
あなたは$cwd
それを通過するために使用します現在の作業ディレクトリ次のようになります。 python venv:python3 -m venv "$cwd"
実際に渡すパスは次のとおりです。home/<USERNAME>/Projects/VueJS/test/$cwd
あなたの場合に渡す実際のパスは次のとおりですcwd
。test
home/<USERNAME>/Projects/VueJS/test/test
「エイリアス」の解決
createVenv() {
python3 -m venv . && source ./bin/activate && [ ! -f ./requirements.txt ] || pip install -r requirements.txt
}
createVenvNode(){
python3 -m venv . && source ./bin/activate && pip install nodeenv && nodeenv -p
}
venv
または、新しいフォルダ(名前が現在のディレクトリのデフォルト名である必要があります)に環境を作成しようとしているので、関数は次のようになります。
createVenv() {
# dest="${PWD##*/}"
# You can run the function `getBaseName` and assign its output like this:
dest=$(getBaseName)
if python3 -m venv "$dest" ; then
cd "$dest"
source "./bin/activate"
[ ! -f "./requirements.txt" ] || pip install -r requirements.txt
echo You are now in new venv environment
else
echo "Failed to create 'venv' environment" >&2
fi
}
createVenvNode(){
# dest="${PWD##*/}"
# You can run the function `getBaseName` and assign its output like this:
dest=$(getBaseName)
if python3 -m venv "$dest" ; then
cd "$dest"
source "./bin/activate"
# You can test the exit status of these commands with an if statement too
pip install nodeenv && nodeenv -p
echo You are now in new venv environment
else
echo "Failed to create 'venv' environment" >&2
}
答え2
これはエイリアスを実行する方法ではありません...試してみてください
alias cwd="pwd | rev | cut -d '/' -f1 | rev"
あなたの場合、bashrcをインポートすると一度評価され、ユーザー名はbashrcをインポートしたときの最後のパス要素であるホームディレクトリの名前です。