realpath 명령을 찾을 수 없습니다

데비안 짜기 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


답변