물결표를 홈 디렉토리에 대한 바로 가기로 사용하는 방법은 무엇입니까?


30

한 PC에서 다른 PC로 일부 파일을 복사하려고하면서 혼란 스러웠습니다. 알아 냈지만 구문은 여전히 ​​혼란 스럽습니다. 이것은 작동합니다 :

scp ~/Desktop/Volenteer.png jay@server.ip:~j0h/b

Volenteer.png폴더에 넣 습니다 /home/j0h/b. 그러나 이것은 작동하지 않습니다.

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

또한 종료 상태 1 파일을 찾을 수 없으므로 실패합니다.

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

이것처럼 :

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

그래서 분명히 사이에 약간의 차이가 ~~/ 차이 즉 존재한다/

$~/
bash: /home/j0h/: Is a directory
$ ~
bash: /home/j0h: Is a directory

그렇다면 왜 scp에서 ~해결 ~/됩니까? 그것은 추측입니다, 나는 그것이 일어나고 있음을 확인할 수 없습니다. 그러나 일관성이 없어 혼동되는 것 같습니다. 이것은 scp의 버그입니까? 아니면 내가 놓친 물결표에 대한 것이 있습니까?


2
여기서 단지 참고로, "e"대신 "u"와 함께 "자원 봉사자"라는 철자가 있습니다.
AER

2
나는 자유로운 철자입니다.
j0h

답변:


68

~ 홈 디렉토리입니다.

~foo는 user의 홈 디렉토리입니다 ( foo이러한 사용자가 존재하는 경우). 또는 ~foo해당 사용자가없는 경우 이름이 지정된 디렉토리 입니다.


따라서

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

~DesktopDesktop그러한 사용자가 존재하고 (보통 존재하지 않는) 또는 단지 ~Desktop(보통 존재하지 않는 경로 ) 경우 user의 홈 디렉토리로 확장됩니다 .


에서:

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

~/j0h라는 디렉토리로 확장됩니다 j0hjay, 다시 존재할 가능성이의 홈 디렉토리.


그것은 아니다 ~~/곳의 차이가 발생하지만,에 ~~foo.


또한 ~디렉토리 히스토리 탐색에도 사용할 수 있습니다.

  • ~-이전 작업 디렉토리입니다 (예 $OLDPWD:)
  • ~+현재 작업 디렉토리입니다 (예 $PWD:)

작업 중에 scp디렉토리를 변경할 수 없으므로이 기능은 적용 할 수 없습니다 scp.

그리고 당신이 사용하는 경우 pushdpopd 디렉토리 스택을 유지하기 위해, 그리고 것 의 출력에서 볼 수 있듯이, 디렉토리 스택의 일 디렉토리 . 것 (두 경우 모두 0에서 계산) 끝에서 일 디렉토리. 예를 들면 다음과 같습니다.~N~+NNdirs~-NN

$ for i in etc usr var tmp; do pushd /$i; done
/etc ~/.vim
/usr /etc ~/.vim
/var /usr /etc ~/.vim
/tmp /var /usr /etc ~/.vim

$ dirs
/tmp /var /usr /etc ~/.vim

그런 다음 다음을 사용하여 스택의 디렉토리에 액세스 할 수 있습니다.

/tmp /var /usr /etc ~/.vim
  ~0   ~1   ~2   ~3     ~4
 ~+0  ~+1  ~+2  ~+3    ~+4
 ~-4  ~-3  ~-2  ~-1    ~-0 
  ~+   ~-

그렇다면 ~+항상 그렇습니다. .맞습니까? 중복 된 것 같습니다.
와일드 카드

1
@Wildcard는 정확하지 않습니다. ~+~-의 값을 사용 $PWD하고 $OLDPWD절대 경로이다. .항상 상대 경로입니다. 따라서 실행할 때 현재 작업 디렉토리를 변경하는 명령이 있으면 .확장 된 경로 ~-가 동일하게 유지 되는 새로운 경로가 표시 됩니다. tar -C예를 들어,에 대한 좋은 사용법을 생각할 수는 없다고 인정합니다 ~+. 공백 이 포함되어 있으면 $PWD인용 ~+/foo/bar할 필요가 없다는 점을 제외하고는 좋을 것입니다 $PWD.
muru

1
고마워요. 실제로 이것은 유스 케이스의 좋은 예입니다. 일부 명령은 보안상의 이유로 상대 경로에서 작동하지 않습니다. 이러한 명령을 사용하면 사용할 수 없지만 더 간단하게 ./filename사용할 수 있습니다 . (일부 명령은 상대 경로 이름에서 작동 하지만 또는 과 같은 기능적 차이가 있습니다.)"$PWD/filename"~+/filenamelntar
Wildcard

21

Bash Tilde Expansion에 대한 GNU 문서를 읽어보십시오 (이 답변을 처음 반복하기 전에해야합니다).

~/Desktop~j0h이유가 설명, 근본적으로 다른 일을하는 ~Desktop작동하지 않습니다

  • 평문 ~은 현재 $HOME환경 변수 로 대체 되며 로그인시 설정됩니다. 그래서 나를 위해 ~해결 /home/oli하고로 ~/Desktop읽습니다 /home/oli/Desktop. 여기에서 tilda가 가장 많이 사용되는 것을 볼 수 있습니다.

  • ~username에서 설정 한대로 해당 사용자 의 홈으로 확인 됩니다 /etc/passwd. 따라서으로 ~oli해결하고 /home/oli, 반드시 ~j0h해결할 수는 /home/j0h없지만, homedir은 어디에나있을 수 있습니다.

  • ~not-a-username해결되지 않습니다. Desktop사용자가 아니기 때문에 ~Desktop대체되지 않습니다. 문자 그대로 파일 또는 경로 ~Desktop(여기에 존재하지 않음)로 사용됩니다.

말할 필요도없이, 이것은 모두 원격으로 발생합니다 ( scp로컬 값으로 대체 된 경우 쓸모가 없습니다 ). 이것은 ~...공백 이외의 것이 앞에 있으면 Bash가 대체하지 않기 때문에 작동합니다 .


무엇합니까 getent passwd bin말은?
muru

2
"bin"은 홈 디렉토리가 / bin 인 대부분의 Linux 시스템에서 시스템 사용자입니다.
fNek

1
확장 실패 ~dir는 GNU 문서와 일치합니다 : "... 물결표 뒤에 물결표 접두어 문자는 가능한 로그인 이름 으로 취급됩니다 ... 로그인 이름이 유효하지 않거나 물결표 확장에 실패하면 단어 변경되지 않은 채 남아 있습니다. " 여기서는 dir이 시스템의 사용자 이름이 아니므로 그대로 유지됩니다.
apillers

모두 감사합니다. 아마해야 읽기 : 내가 게시 링크
OLI

4

상징 ~하는 단축키로 사용할 /home/user에서 bash그렇게하는 경우, ~/Desktop/Volenteer.png그것은 속기이다 /home/user/Desktop/Volenteer.png.

보시 /다시피 항상 그렇듯이 파일 시스템 계층의 새로운 수준을 보여줍니다.


3
$ HOME 환경 변수의 약식입니다. ~{user}/passwd (5) 데이터베이스 파일에서 설정 한 임의의 임의 경로 일 수 있습니다. 예, filesytem.org 표준은 일반 사용자를 / home에 배치하지만 모든 사용자에게는 해당되지 않습니다 (예 : / root의 루트 및 / var / ... 또는 / home 대신 / usr을 사용하는 이전 유닉스의 서비스)
드와이트 스펜서

DwightSpencer가 정확합니다. 사용자가 / usr / {CLIENTNAME} / home /에 있고 여러 사내 및 원격 시스템 (모두 해당 디렉토리를 가리킴)에서 공유되는 여러 서버를 유지하므로 하나의 시스템 만 유지하면됩니다. 그리고 ~는 그 디렉토리를 가리킨다;)
Rinzwind

3
@Rinzwind eek. 나는이 희생적인 오용에 항의해야합니다 /usr.
muru

@muru 안녕하세요, 내 전화가 아니 었습니다.>
:-D

1
솔직히 나는 사용자가 모든 것을 위해 / usr을 사용하는 것이 좋았습니다. 요즘 내가 찾은 것은 기본 binutils 외부의 모든 바이너리 (sys, user, sysop)의 거대한 통합 덤프 장으로 / usr / bin을 더 희생적으로 잘못 사용하는 것입니다. 결국 / usr은 사용자가 nfs 마운트에서 가져 오기 위해 액세스 할 수있는 모든 것을 의미하는 반면, / usr / local은 / sbin을 sysop 바이너리 및 / bin 시스템 바이너리로 사용하는 로컬 사용자 공간이었습니다. / home은 다른 파티션이 될 수 있지만 / usr / home / ...도 가능합니다. / usr에 보관하면 정책, 구현 및 사고 방식 모두에서 사용자 네임 스페이스로 유지됩니다.
드와이트 스펜서

3

~$HOME대부분의 c 쉘 파생 / 지원 POSIX 호환 쉘 에서 환경 변수의 줄임말입니다 . 가장 일반적인 용도 ~는 자신의 홈 디렉토리 나 다른 사용자의 홈 디렉토리를 참조 할 때입니다.

cd ~ # ie shell, take me to my home folder

cd ~root # i.e. shell, take me to root's home folder

passwd (5) 데이터베이스를 사용하는 POSIX 시스템 (UNIX, Linux, OS X, BSD)에서 로컬 사용자의 홈 디렉토리를 찾으려면 다음 /etc/passwd과 같이 awk를 실행하십시오 .

awk -F: '{ print $1,$(NF-1) }' /etc/passwd

각 로컬 사용자 및 홈 디렉토리가 나열됩니다.

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