it-gundan.com

Bash의 디렉토리 및 상대 경로를 찾으려면 $ 0 변수를 어떻게 분할합니까?

$ 0 변수에는 스크립트의 경로 정보가 들어 있습니다.

  • 경로 정보를 절대 경로로 변경하려면 어떻게해야합니까? 나는 ~, .., .. 또는 이와 유사한 방법을 의미합니까?
  • 경로 정보를 디렉토리 및 파일 이름으로 어떻게 분할하려면 어떻게합니까?

나는 이것을 위해 python/perl을 사용할 수 있지만 가능한 경우 bash를 사용하고 싶습니다.

10
prosseek

~와 같은 일을 처리 할 필요가 없습니다. 쉘은 당신을 위해 그것을합니다. 그래서 어떤 스크립트 또는 프로그램에 ~/filename를 전달하고 작동합니다. 이러한 모든 프로그램은 ~ 스스로를 처리하지 않습니다. 쉘은 인수를 /home/username/filename로 변환하고 패스를 통과합니다. 대신 프로그램에

$ echo ~/filename
/home/mrozekma/filename

정규 파일 이름이 필요한 경우 (..과 같은 것들이 포함되지 않은 것), realpath (감사 Neil ) :

$ realpath ~/../filename
/home/filename

경로를 디렉토리 이름과 파일 이름으로 분리하기 위해 dirnamebasename :

$ dirname /foo/bar/baz
/foo/bar

$ basename /foo/bar/baz
baz
17
Michael Mrozek

Michael에서 언급 한 것처럼 Dirname과 Basename을 사용하면 원하는 것을 얻는 가장 안전한 방법이어야합니다.

어쨌든 "Bash only Tools"로 정말로이 작업을 수행하려는 경우 매개 변수 대체를 사용할 수 있습니다.

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에서 $ VAR의 프런트 엔드와 일치하는 $ VAR의 가장 짧은 부분에서 제거하십시오. $ {var ## Pattern} $ VAR의 프런트 엔드와 일치하는 $ VAR에서 $ VAR에서 제거하십시오.

욕심 많은/비 탐욕스러운 수정 자의 어떤 종류의 regex와 # 또는 ##와 같은 패턴을보십시오.

경로 부품의 더 복잡한 추출을 해야하는 경우 유용 할 수 있습니다.

5
echox

realpath은 실제 경로를 알려주는 명령입니다 (제거하고 기호 링크 등을 제거하십시오).

FreeBSD가있는 표준입니다. 이 토론에 따르면 Linux에서도 사용할 수 있습니다.

http://www.unix.com/shell-programming-scripting/89294-geting-real-path.html .

그 토론은 또한 bash 솔루션을 제공합니다 :

$ bash -c "cd /foo/../bar/ ; pwd"
2
delete