데비안 짜기 amd64가 있습니다. 내 현재 쉘은 bash입니다. 터미널에 다음을 쓰면 작동합니다.
$ uname -a
Linux core 2.6.32-5-amd64 #1 SMP Fri May 10 08:43:19 UTC 2013 x86_64 GNU/Linux
$ echo $SHELL
/bin/bash
$ echo $(realpath test.sh)
/home/ffortier/test.sh
내 test.sh 파일은 다음과 같습니다.
#!/bin/bash
echo $(realpath "$1")
다음을 실행하려고하면 오류가 발생합니다.
$ ./test.sh test.sh
./test.sh: line 2: realpath: command not found
bash 파일 내에서 realpath 명령을 어떻게 사용합니까?
추가 정보
$ type -a realpath
realpath is a function
realpath ()
{
f=$@;
if [ -d "$f" ]; then
base="";
dir="$f";
else
base="/$(basename "$f")";
dir=$(dirname "$f");
fi;
dir=$(cd "$dir" && /bin/pwd);
echo "$dir$base"
}
답변
realpath는 실제 명령입니까 아니면 스크립트입니까? 어디에서 왔는지 확인하겠습니다.
$ type -a realpath
이 도구에 익숙하지 않으므로 정규 배포의 일부가 아닐 수 있습니다. 아마도 Bash에는 $PATH
없지만 로그인 환경 내에 있는 비표준 위치에 설치되었을 수 있습니다 $PATH
.
어쨌든 위의 type
명령은 명령이 어디에서 왔는지 보여 주므로 스크립트에서 호출하는 메소드를 다음과 같이 변경할 수 있습니다.
echo $(/path/to/realpath test.sh)
또는 $PATH
이 비표준 위치도 포함하도록 스크립트를 수정하십시오 .
쉘의 함수
쉘 스크립트를 호출 할 때 많은 환경이 호출되지 않습니다. 일반적으로 스크립트가 사용자 환경에있을 수있는 모든 추가 수하물을 갖기를 원하지 않기 때문에이 점을 고려하면 의미가 있습니다.
이 기능을 제공하는 소스 파일을 판별하고이를 소스 화하거나 로그인 환경을 통합하도록 Bash에 지시 할 수 있습니다.
#!/bin/bash -l
echo $(realpath "$1")
답변
다음과 같은 두 가지 이상의 프로그램이 있습니다 realpath
.
- GNU coreutils에 포함되지 않은 이전 프로그램
readlink -f
. 현재는 더 이상 사용되지readlink -f
않으므로 많은 배포판에서 배포를 중단했습니다. - 이
realpath
프로그램은 GNU coreutils 8.15에서 도입되었습니다. 이것은 데비안 짜기 또는 너무 어색하기에는 너무 오래되었습니다. 글을 쓰는 시점에서 데비안 불안정한 것도 그것을 제공하지 않습니다 . 이 프로그램은 매우 가깝습니다readlink -f
.
어떤 이유로,의 동작을 부분적으로 에뮬레이트하는 쉘 함수가 realpath
있습니다. 이 에뮬레이션은 부분적입니다. 심볼릭 링크에서 호출하면 심볼릭 링크를 따르지 않습니다.
이 함수는 쉘 함수로, 또는를 통해로드 .bashrc
될 수 있으므로 대화식 쉘에서 코드를 실행하는 경우에만 사용할 수 있습니다. Linux를 실행한다고 가정하고 다른 프로그램에서 사용할 수있게하려면 realpath
다음 을 에뮬레이트하는 스크립트를 작성하십시오 .
#!/bin/sh
readlink -f -- "$@"
(이것은 realpath
거의 사용되지 않는 명령 행 옵션을 모방하지 않습니다 .)
답변
스크립트 파일의 범위가 다르고 rc 파일에 정의 된 로컬 함수 및 별명에 액세스 할 수 없으므로 쉘에서만 작동 합니다. 그리고 realpath
실제로 시스템에는 명령이 없습니다.
따라서 realpath
패키지에서 설치하거나 스크립트의 일부로 자신의 기능을 정의하거나 ( 예를 확인 하십시오) 스크립트에서 rc 파일을 정의한 곳 (예 :)을 소싱하십시오 . ~/.bashrc
.
realpath
없는 경우 설치 단계는 다음과 같습니다 .
- 우분투 :
sudo apt-get install coreutils
- OS X :
brew install coreutils
우분투 및 데비안
데비안 또는 우분투에서는 realpath
기본적으로 설치되어 있어야합니다. 최근 데비안 8 (Jessie)을 확인했는데 coreutils
기본적으로 설치되어있는 것 같습니다 .
새로운 VM 이미지를 사용하여 테스트했습니다.
$ vagrant init debian/jessie64 && vagrant up --provider virtualbox && vagrant ssh
$ vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh
그런 다음 VM에서
$ type -a realpath
realpath is /usr/bin/realpath
대신 패키지에서 제공 realpath
하는 readlink -f file
(또는 greadlink
)을 사용할 수도 있습니다 coreutils
.
답변
$ sudo apt-get install realpath