Mac 터미널에서 실행되는 이 bash 파일은 디렉터리를 변경할 수 없습니다. 대신 실제로 존재하더라도 부재를 보고하세요. 내가 뭐 잘못 했어요?
#!/usr/bin/env bash
set -e
read name
APPLICATION_PATH="~/Documents/meteor/apps/$name"
cd "${APPLICATION_PATH}"
답변1
두 가지 점이 있습니다.
- 물결표 확장 문제
- 조달 및 실행 문제.
물결표 부분의 경우 SuperUser의 최근 질문은 동일한 문제에 관한 것입니다(https://superuser.com/questions/1161493/why-bash-script-wont-extend-bashrc/1161496#1161496)
물결표는 변수 앞에서 확장되므로 cd는 경로를 찾을 수 없습니다. 이 문제를 극복하기 위해 eval
명령을 다음과 같이 지정할 수 있습니다.
eval cd "${APPLICATION_PATH}"
불행하게도 스크립트를 실행할 때(호출 경로인 "+x"로 chmod를 지정했다면) $PWD가 "현재 쉘"에서 변경되지 않은 것을 볼 수 있습니다. 그러나 스크립트 끝에 이와 같은 줄을 추가하면
ls
ls
새 작업 디렉터리에서 실행되는 것을 볼 수 있습니다 . 어떻게요?
짧은 대답: 조달은 현재 쉘 프로세스에서 명령을 실행합니다. Execute는 새로운 쉘 프로세스에서 명령을 실행합니다. 아직도 혼란스러워요? 긴 답변을 읽어보세요.
곧 현재 셸에서 $PWD를 변경하려면 다음과 같은 스크립트를 "가져와야" 합니다.
source /path/to/script
또는
. /path/to/script
source
세 번째 요점: or 를 엉망으로 만들고 싶지 않다면 .
~/.bashrc(https://stackoverflow.com/questions/752525/run-bash-script-as-source-without-source-command):
별칭 mycmd="source mycmd.sh"
답변2
tilda '~'를 사용할 수 있습니다. 올바른 bash 확장 키를 켜기만 하면 됩니다.
set -x
또는 전체 경로 "/Volumes/Swap/Apps/..."를 사용하십시오.
예를 들어 bashrc를 사용하여 env 바로 가기를 설정하십시오.
export LocalApps=/Users/me/Applications
export SysApps=/Applications
eval을 어떻게 사용하는지 모르겠습니다.
명령줄에서 문자열을 읽으려면 read를 사용할 필요 없이 인수만 가져오면 됩니다.
if [[ $# -eq 1 ]]; then
#check if it's directory
if [[ -d $name ]] ; then
#do stuff here
else
echo 'bomb'
fi
else
usage
fi
디렉토리에 "cd" 대신 ~+, ~-, pushd 및 popd를 사용하는 방법을 알아보세요. 실제로 디렉토리에 "cd"할 필요는 없습니다.
당신은 이런 일을 할 수도 있습니다
pushd $SysApps/$name
do stuff
popd
답변3
"" 안에 ~를 넣지 마세요.
#!/usr/bin/env bash
set -e
read name
APPLICATION_PATH=~/Documents/meteor/apps/$name
cd "${APPLICATION_PATH}"
pwd
답변4
또 다른 해결 방법은 사용 중인 현재 터미널 창의 스크립트에서 정확히 디렉토리로 cd하지 않더라도 osascript를 사용하여 다른 터미널을 열고 원하는 디렉토리로 cd하는 것입니다.
osascript -e "
tell application \"Terminal\"
do script \"cd $APPLICATION_PATH; pwd;\"
set bounds of front window to {900, 0, 1790, 565}
end tell"
새로운 가상 호스트를 생성하기 위한 스크립트를 작성할 때 이 방법이 효과적입니다. "앞 창 경계 설정"은 선택 사항입니다.