현재 디렉터리 이름을 기반으로 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에서 검색했는데 이는 현재 디렉터리 이름을 가져오는 제안된 방법 중 하나입니다.

시작하는 방법이나 정보를 찾을 수 있는 위치에 대한 몇 가지 조언을 주시면 감사하겠습니다. 여러 소스를 검색해 보았지만 알 수 없는 것 같습니다. 큰따옴표와 작은따옴표 사이에 차이가 있다는 내용을 어딘가에서 읽었지만 그 이유와 이것이 이 동작에 영향을 미치는지 이해할 수 없습니다.

편집: 명확히 하기 위해 별칭을 실행하려는 것은 다음과 같습니다.

  • 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.testhome/<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를 가져올 때 마지막 경로 요소인 홈 디렉터리의 이름입니다.

관련 정보