現在のディレクトリ名に基づいてPython venv設定を実行するためのエイリアスの設定

現在のディレクトリ名に基づいてPython venv設定を実行するためのエイリアスの設定

問題が何なのかわからないようです。これはデフォルト設定(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あなたの場合に渡す実際のパスは次のとおりですcwdtesthome/<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
}

おすすめ記事