bash에서 디렉토리와 상대 경로를 찾기 위해 $0 변수를 분할하는 방법은 무엇입니까?

bash에서 디렉토리와 상대 경로를 찾기 위해 $0 변수를 분할하는 방법은 무엇입니까?

$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"

관련 정보