bash에서 디렉토리와 상대 경로를 찾기 위해 $ 0 변수를 어떻게 분할합니까? 유사한 것을 처리하는 방법을 의미합니까? 경로 정보를 디렉토리와

$ 0 변수는 스크립트의 경로 정보를 포함합니다.

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

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



답변

당신은 같은 것들을 처리 할 필요가 없습니다 ~. 쉘이 당신을 위해 그것을합니다. 그렇기 때문에 ~/filename모든 스크립트 또는 프로그램에 전달할 수 있고 작동합니다. 모든 프로그램이 ~자체적으로 처리하지 않고 쉘은 인수를 변환하여 /home/username/filename대신 프로그램에 전달합니다.

$ echo ~/filename
/home/mrozekma/filename

당신은 표준 파일 이름 (같은 것들을 포함하지 않는 한이 필요한 경우 .., 사용) realpath(감사 )

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

분할 디렉토리 이름과 파일 이름 사용에 경로로 dirnamebasename:

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

$ basename /foo/bar/baz
baz


답변

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

어쨌든 “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.

이 예제는 Advanced Bash Scripting Guide 에서 직접 가져온 것입니다.

설명은 매우 간단합니다.

$ {var # Pattern} $ var의 프론트 엔드와 일치하는 $ Pattern의 가장 짧은 부분을 $ var에서 제거하십시오. $ {var ## Pattern} $ var의 프론트 엔드와 일치하는 $ Pattern의 가장 긴 부분을 $ var에서 제거하십시오.

정규식 #이나 ##욕심 / 비 욕심 수정 자 와 같은 패턴을보십시오 .

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


답변

realpath 실제 경로를 알려주는 명령입니다 (.. 및 심볼릭 링크 제거 등).

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

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

이 토론은 또한 bash 솔루션을 제공합니다.

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


답변