물결표`~`는 상대 경로로 간주됩니까?


35

Nvidia cuda 라이브러리 설치 프로그램의 다른 부분을 추출하려고합니다. 다음 명령을 사용하고 있습니다.

mkdir ~/Downloads/nvidia_installers
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers

그리고 다음과 같은 메시지가 나타납니다.

ERROR: extract: path must be absolute.

그리고 집의 리터럴 주소로 명령을 입력하면 완벽하게 작동합니다.

./cuda_6.5.14_linux_64.run -extract=/home/likewise-open/XXX/username/Downloads/nvidia_installers

혼란 스럽습니다 ~ / home / likewise-open / XXX / username과 동일하지 않아야합니까?

테스트 :

./cuda_6.5.14_linux_64.run -extract=$HOME/Downloads/nvidia_installers

작동하지만 왜 허용되지 않는지 모르겠습니다. ~


2
관련 : ""접두사 접두사 "는 단어의 시작 부분에 인용되지 않은 <tilde> 문자로 구성되고 그 뒤에 첫 번째 인용되지 않은 문자 앞에 오는 모든 문자가 이어집니다"
Braiam

답변:


47

Bash는 단어의 시작 인 경우에만 ~를 확장합니다. 다음 명령 사이에서이를 확인할 수 있습니다.

$ echo -extract=~/test
-extract=~/test

oli@bert:~$ echo -extract ~/test
-extract /home/oli/test

Bash는 독립형 ~문자 ~/와이 대체 문자를 찾습니다 . 다른 조합이나 인용 버전은 작동하지 않습니다.

$HOME변수 대체가 더 강력하기 때문에 작동합니다 ( $특수 문자이지만 ~훨씬 적습니다).

$ echo Thisisastring${HOME}awrawr
Thisisastring/home/oliawrawr

우리가 이야기하는 동안 ~실제로 다른 대체 용도가 몇 가지 있습니다.

  • ~+현재 작업 디렉토리 (에서 읽음 $PWD)
  • ~-이전 작업 디렉토리 (에서 읽음 $OLDPWD)

plain과 마찬가지로 ~이것들은 끝에 추가 경로가 붙을 수 있으며 다시 말하면 접두사가 단어이거나 접두사가 Bash가 무시합니다.

이에 대한 자세한 내용은 man bash | less -p ' Tilde'


2
그것은 그 주목할 가치가 zsh 않습니다 (또는 오히려하도록 구성 할 수 있습니다)를 확장 ~한 후 =너무. 다른 편리한 개선 사항 중 bash가 있습니다.
Jan Hudec

@JanHudec 아니요-더 복잡합니다. 그것은 후에 확장하는 것이 아닙니다 =. 오른쪽의 시작 부분에서 변수 할당을 확장하는 것입니다. 자세히 살펴보면 사례가 좀 더 혼란스러워집니다. 내 답변을 참조하십시오. 그리고 이것과 zsh다르지 않습니다 bash. 'zsh'에 대한 설명은 약간 까다 롭습니다. info --subnodes zsh | less +/'14.7.4 Notes'(zsh 맨 페이지가 누락 됨)
Volker Siegel

1
@ VolkerSiegel : zsh매우 구성 가능합니다. 내 zsh에서 echo -extract=~/test결과는 -extract=/home/user/test입니다. MAGIC_EQUAL_SUBST옵션 으로 활성화됩니다 . 참고로, 모든 zsh 매뉴얼 페이지는 괜찮습니다.
Jan Hudec

@JanHudec zsh설정 가능한 것에 대해 의심의 여지가 없습니다 . MAGIC_EQUAL_SUBST (14.7.4에서 다룬)는 기본적으로 설정되어 있지 않으며 거의 ​​사용되지 않습니다. 이제 일반적으로 활성화하면 더 관련성이 있습니다. 예제 섹션을 좋은 모양으로 만든 후에는 훌륭한 추가 기능을 제공 할 것입니다.
Volker Siegel

@JanHudec zsh 매뉴얼 페이지와 관련하여, 그것들은 잠시 동안 우분투 패키지에서 빠져있었습니다. 힌트 덕분에 그것이 수정되었다는 것을 몰랐습니다. 버그를 살펴보면 우 토픽으로 수정되었지만 신뢰할 수는 없습니다. ( 런치 패드 : 모든 zsh 맨 페이지 및 인라인 도움말 파일이 없고 AU : zsh 맨이 없습니다 ... )
Volker Siegel

19

그냥 고쳐

이 명령은 "ERROR : extract : path must be absolute"오류 메시지를 표시합니다.

./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers

이 오류는 도움이되지 않습니다. 프로그램이 이미 혼동되었습니다.
이미 오류가에서 알고 ~그와 함께 작동하기 때문에, $HOME대신.

문제 ~는 단어가 시작될 때만 교체됩니다.

예를 들어, 이것은 물결표와 함께 작동합니다.

echo -extract ~/Downloads

옵션 구문이 필요한 경우 =$ HOME 대신 $ HOME을 사용하는 ~것이 가장 깨끗한 솔루션입니다.

echo -extract=$HOME/Downloads

연습

알아야 할 사항 :

~단어가 시작되지 않을 때 get이 확장 되는 특수한 경우가 있습니다 : 변수 할당의 일부로 =. 물론 여기서 혼란 스럽습니다.

다른 중요한 특별한 경우는 PATH와 같은 변수와 함께 사용하기위한 것입니다. 변수 할당에서는 첫 번째 ~이후 :와 같이 이후에도 확장 =됩니다.

$ dir=~ sh -c 'echo D2: $dir'
D2: /home/user
$ sh -c 'echo D2: $dir' dir=~
D2: 
$ echo Dir: $dir
Dir:
$ dir=~; sh -c 'echo D2: $dir'
D2: 
$ echo Dir: $dir
Dir: /home/user
$ sh -c 'echo D2: $dir'; d3=~
D2: 
$ echo d3: $d3
d3: /home/user

물결표의 의미

~에서 물결표는 실제로 경로가 아닙니다. 경로 ()로만 대체됩니다 $HOME.

쉘에서 제공하는 속기 또는 약어와 같은 것입니다.
일반적으로 경로처럼 사용할 수 없으며, 쉘은 매우 특별한 장소에서만 경로로 "확장"합니다.
확장 되더라도 홈 디렉토리 이외의 다른 디렉토리 일 수 있습니다.

  • 그것은 단지에서 확장 단어의 시작 A의, 또는 후 변수 할당 :또는=
  • 따옴표 안에 있지 않은 경우에만 확장됩니다.
  • 단어 앞에 더 이상 문자$HOME없는 경우 에만 확장됩니다 ./

명령 줄의 문제

이것에 따르면, 명령의 문제는 물결표가

-extract=~/Downloads/nvidia_installers

이 사례 중 하나가 아니기 때문에 확장되지 않습니다. 그게 다야.

해결책은 물결표를 단어의 첫 번째 인용되지 않은 문자로 만들고 다음 문자 앞에 다른 문자를 넣지 않는 /것입니다-옵션 인수 앞에 공백이있는 옵션을 사용할 때 얻는 것입니다.

-extract ~/Downloads/nvidia_installers

다른 해결책은 $HOME대신 사용하는 것입니다. 스크립트에서는 일반적으로 더 나은 선택입니다.

-extract=$HOME/Downloads/nvidia_installers

오류 메시지

그러나 오류 메시지는
"ERROR: extract: path must be absolute."어떻게됩니까?
이 모든 것에 맞습니까?

물결표가 확장되지 않았다는 것을 알고 있습니다. 즉, 프로그램은 경로를 포함 ~하지 않고 인수 텍스트를 포함한다는 것을 의미합니다 /home/auser. 그 길은 ~/Downloads/nvidia_installers-지금은 껍질이 없기 때문에 물결표는 특별한 의미가 없습니다. 단지 일반적인 디렉토리 이름입니다. 그리고 양식의 다른 모든 경로와 마찬가지로 foo/bar/baz상대 경로입니다.

다른 용도

위의 다른 모든 규칙과 ~마찬가지로 ~alice- 뒤에 문자 가 있고 사용자 이름 alice이 있으면 그 alice대신 홈 디렉토리로 확장됩니다 home/alice.
또한,이 경우 bob, ~로 확장 것 /home/bob, 그리고 ~bob동일로 확장한다.

변형 ~+이 현재 디렉토리로 확장됩니다.$PWD

마지막 디렉토리 이전의 이전 디렉토리를 참조하려면을 사용하여 확장 cd할 수 있습니다 .~-$OLDPWD

당신이 사용하는 경우 pushdpopd대신, cd이미 디렉토리 스택처럼 액세스 할 수 있는지 알게 될 것이다 ~-2.

세부

~경로 확장 된 모든 경우 는 쉘에 의해 처리됩니다 . 다른 프로그램의 ~경우 일반적인 파일 이름 문자입니다.

대한 정확한 정의 쉘 내부, 여기의 관련 섹션 교체하는 방법을 참고 로하여 많은 경우 중 하나에 불과 특별한 경우가 : 이 로그인 이름이 널 (null) 문자열이 ", 물결표는 쉘 변수 홈의 값으로 대체됩니다. " :man bash
~$HOME

Tilde Expansion
    If a word begins with an unquoted tilde character (`~'), all of the charac‐
    ters  preceding the first unquoted slash (or all characters, if there is no
    unquoted slash) are considered a tilde-prefix.  If none of  the  characters
    in  the tilde-prefix are quoted, the characters in the tilde-prefix follow‐
    ing the tilde are treated as a possible login name.  If this login name  is
    the  null string, the tilde is replaced with the value of the shell parame‐
    ter HOME.  If HOME is unset, the home directory of the user  executing  the
    shell is substituted instead.  Otherwise, the tilde-prefix is replaced with
    the home directory associated with the specified login name.

    If the tilde-prefix is a `~+', the value of the shell variable PWD replaces
    the  tilde-prefix.   If  the tilde-prefix is a `~-', the value of the shell
    variable OLDPWD, if it is set, is substituted.  If the characters following
    the tilde in the tilde-prefix consist of a number N, optionally prefixed by
    a `+' or a `-', the tilde-prefix is replaced with the corresponding element
    from  the  directory  stack,  as  it would be displayed by the dirs builtin
    invoked with the tilde-prefix as an argument.  If the characters  following
    the  tilde in the tilde-prefix consist of a number without a leading `+' or
    `-', `+' is assumed.

    If the login name is invalid, or the tilde expansion  fails,  the  word  is
    unchanged.

    Each variable assignment is checked for unquoted tilde-prefixes immediately
    following a : or the first =.  In these cases, tilde expansion is also per‐
    formed.   Consequently, one may use filenames with tildes in assignments to
    PATH, MAILPATH, and CDPATH, and the shell assigns the expanded value.

3

~경로 자체가 아닙니다. 그것은 셸에서 특별 대우를 얻는다 캐릭터의 ~또는 ~/"현재 사용자의 홈 디렉토리 경로로 교체"를 의미한다. ~username"사용자 이름의 홈 디렉토리 경로로 교체"를 의미합니다.

경로가 아니기 때문에 명령의 특정 위치에서만 (새 공간 분할 토큰의 첫 문자로) 인식됩니다.

확장되면 절대 경로로 바뀝니다.

사용 $HOMEHOME 그냥 쉘이 변수 설정과 변수 교체를 위해 일반 쉘 규칙 (입력이 공간에 분할하고 실행하기 전에 그런 일이) 다음 있기 때문에 작품.


1

당신이 올바른지. ~ / Downloads는 / home / username / Downloads와 동일합니다.

일부 설치 프로그램 및 추출기는 설치 위치에 매우 까다 롭습니다. 파일 경로를 기록하기 때문에 로그가 허용되는 경로에서 ~를 허용하지 않기 때문일 수 있습니다.

방금 / home / username을 입력하는 데 익숙했습니다. :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.