$0 변수에는 스크립트에 대한 경로 정보가 포함되어 있습니다.
- 경로 정보를 절대 경로로 변경하는 방법은 무엇입니까? 내 말은 ~,.,..또는 이와 유사한 것을 처리하는 방법을 의미합니까?
- 경로 정보를 디렉토리와 파일 이름으로 분할하는 방법은 무엇입니까?
이를 달성하기 위해 python/perl을 사용할 수 있지만 가능하다면 bash를 사용하고 싶습니다.
답변1
그런 일을 처리할 필요는 없습니다 ~
. 쉘이 대신 처리해 줍니다. 이것이 바로 ~/filename
어떤 스크립트나 프로그램에 전달할 수 있고 작동할 수 있는 이유입니다. 이러한 모든 프로그램은 ~
스스로 처리하지 않으며 쉘은 인수를 변환하여 /home/username/filename
프로그램에 전달합니다.
$ echo ~/filename
/home/mrozekma/filename
표준 파일 이름이 필요한 경우 (예 ..
:realpath
닐):
$ realpath ~/../filename
/home/filename
경로를 디렉토리 이름과 파일 이름으로 분할하려면 dirname
다음을 사용하십시오 basename
.
$ dirname /foo/bar/baz
/foo/bar
$ basename /foo/bar/baz
baz
답변2
Michael이 언급한 것처럼 디렉터리 이름과 기본 이름을 사용하는 것이 원하는 것을 얻는 가장 안전한 방법입니다.
어쨌든 "bash 전용 도구"를 사용하여 이 작업을 수행하려면 매개변수 대체를 사용할 수 있습니다.
echo `basename $PWD` # Basename of current working directory.
echo "${PWD##*/}" # Basename of current working directory.
echo
echo `basename $0` # Name of script.
echo $0 # Name of script.
echo "${0##*/}" # Name of script.
echo
filename=test.data
echo "${filename##*.}" # data
# Extension of filename.
이 예는 다음에서 직접 가져온 것입니다.고급 Bash 스크립팅 가이드볼만한 가치가 있습니다.
설명은 간단합니다.
${var#Pattern} $var의 프런트 엔드와 일치하는 $Pattern의 가장 짧은 부분을 $var에서 제거합니다. ${var##Pattern}은 $var의 프런트 엔드와 일치하는 $Pattern의 가장 긴 부분을 $var에서 제거합니다.
패턴을 정규 표현식 및 #
/또는 ##
욕심 많은/비 욕심 많은 수정자로 생각하세요.
이는 경로 부분을 좀 더 복잡하게 추출해야 하는 경우 유용할 수 있습니다.
답변3
realpath
실제 경로를 알려주는 명령입니다(.. 및 심볼릭 링크 제거 등).
FreeBSD 표준입니다. 이 토론에 따르면 Linux에서도 작동합니다.
http://www.unix.com/shell-programming-scripting/89294-geting-real-path.html
토론에서는 bash 솔루션도 제공합니다.
$ bash -c "cd /foo/../bar/ ; pwd"