문제가 무엇인지 알 수 없는 것 같습니다. 이것은 기본 설정(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
.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를 가져올 때 마지막 경로 요소인 홈 디렉터리의 이름입니다.