작업중인 UNIX 디렉토리 내부의 물결표 (~)


22

그래서 저는 UNIX 환경에서 일하고 있으며 UNIX 홈에서 몇 마일 떨어진 내 작업 디렉토리에 ~.

과거에는 한 번은 rm -rf ~작업 디렉토리에서 작업을 마치고 홈 디렉토리를 완전히 지우고 IT를 사용해야했습니다.

다시하고 싶지 않습니다. 동시에 나는 알고 싶어

  1. ~작업 디렉토리에 왜 생성됩니까? 그것은 저장하는 동안 결함 손가락 슬립입니다 ( :w!하지만 무슨 일이다 :w~?!)

  2. 체크인하기 전에 p4가 인식하지 못하는 추가 파일 또는 폴더를 찾는 스크립트 ~가 있으므로 이로 인해 문제가 발생할 수 있습니다. 어떻게 ~작업 디렉토리에서를 제거 하고 동시에 집을 지울 수 있습니까?

del대신 사용 하는 백업 명령 이 rm -rf있습니다. 단지 임시 위치에 물건을 배치합니다. 나는 그것을 사용할 수 있고를 제거 할 수 있습니다 ~. 그러나 왜 이런 일이 발생하는지, 어떻게 제거 할 수 있는지 알고 싶습니다.


일반적으로 쉘은 경로 시작시 ~를 홈 디렉토리로 바꿉니다. 전체 경로 /home/yourUserName/~를 사용하여라는 디렉토리에 액세스하십시오 ~.
jofel

그리고 ~ otheruser / file을 사용하여 완전성을 위해 다른 사용자의 홈 디렉토리를 참조 할 수 있습니다.
godlygeek

장난처럼 보입니다!
Xolve 2016 년

답변:


36

인용하십시오 :

rm -i '~'
rm -i "~"
rm -i \~

또는 기본 이름 대신 경로로 참조하십시오.

rm -i ./~
rm -i /path/to/~

웃기는 것처럼 보이는 단일 문자 이름 임에도 불구하고 이것은 개념적으로 파일 이름 SOME$PATH을 만든 경우와 다르지 않습니다.

touch 'SOME$PATH'

그리고 다음을 수행하여 제거하려고했습니다.

rm -i SOME$PATH

( 경고 :이 SOME$PATH 예제 에서는 변수 를 따옴표로 묶지 않았습니다. 일반적으로 따옴표로 묶습니다. 'SOME$PATH' )

두 경우 모두, 쉘은 사용자가 지정한 이름을 확장하므로이를 방지해야합니다.

또한 : rm -rf파일을 제거하는 데 사용하지 마십시오 ! 전체 목적 rm -rrm디렉토리를 제거해도된다는 것을 알리는 것입니다. 파일을 제거하는 동안 실수로 전체 디렉토리를 제거하지 않으려면 습관적으로 통과하지 마십시오 -r!


12
방금 이것을 테스트했습니다. :w~vim에서이라는 파일을 만들었습니다 ~. rm ~을 반환했습니다 cannot remove /home/seth it is a directory. 파일을rm "~" 제거했습니다 . 밑줄을 긋기 만하면 자동으로 전달되지 않습니다 . -rf
Seth

4
폭력적인 옵션을 기본적으로 생략하는 것이 좋습니다. 이것은 kill -9기본적 으로 수행 하는 것과 비슷합니다 .
Celada

나는 예제가 rm -i $FOO의도적으로 예제를 위해 변수를 인용하지는 않지만 여전히 셸 예제를 포함 rm하고 인용되지 않은 변수를 인수로 표시하는 것은 컨텍스트와 무관하게 매우 나쁜 것 입니다. 나는 심지어 prooven 할 수 있다고 확신한다 :) 나는 약간의 메모를 추가 할 것이다. 그러나 아마도 당신은 예제를 조금 바꿀 수 있을까?
Volker Siegel 2018 년

@VolkerSiegel, Point taken-편집 작업에 참여했지만 각주가 너무 무거워 보였습니다. 또한 문제를 일으킬 가능성이 적은 변수 이름으로 전환했습니다. 대부분의 사람들은 SOME/bin:/usr/bin파일 시스템에 파일 이름이 없습니다 . :)
godlygeek

예, 좋아 보입니다! (나는 거의 대답 할 것입니다 : 무엇? 헤비 핸드? 당신은 당신의 삶에서 실제 인용 문제를 경험 한 적이 있습니까?;) 일반적으로 거기에 잘못된 쉘 예제의 양에 대해 다소 절망적입니다. 잘못된 예 없이도 이해하는 것! )
Volker Siegel 2016 년

1

물결표의 맥락에서 단독으로 사용될 경우 ls ~~는 홈 디렉토리의 바로 가기로 홈 디렉토리를 나열합니다. 당신이 그랬 ls ~brown다면 당신은 브라운의 홈 디렉토리의 내용을 나열 할 것입니다.

별도의 지시가없는 한 VIM은 변경된 파일의 백업 사본 인 myFile myFile ~을 작성합니다.

이 동작은 백업을 생성 할 때 유용하지만 원하지 않는 경우 .vimrc 파일에 추가하십시오. 백업을 설정하지 마십시오 (방금 액세스 한 경우 vi ~/.vimrc).

그리고 물론 다른 사람들이 말했듯이 ~라는 파일이 있으면 단순히 \를 사용하여 char을 이스케이프하십시오 ~

me 217 % vi this      (saved as :w~)
me 218 % ls
this  ~
me 219 % cat \~
kfdkdfk
me 220 % \rm \~
me 221 % ls
this

0

이것은 잘못된 유형에 의해 영향을받을 수 있습니다. TERM=xterm구성이 내 것과 비슷한 경우 키보드의 모든 기능 키는 다음과 같은 이스케이프 시퀀스를 보냅니다.

infocmp -1 | grep -n \~ | tail -n3
138:    kich1=\E[2~,
141:    knp=\E[6~,
142:    kpp=\E[5~,

출력의 절반 이상이 기계에 물결표 이스케이프 가 infocmp -1포함되어 있으며 대부분의 작업을 이해하지 못했습니다. 나는 실제로 대부분의 경우 줄의 이스케이프 된 부분을 실제로 먹고 물결표남는다는 것을 알고있다 .~zsh~

예를 들어, echo다음 <space>을 입력 F6하고 <return>인쇄하면 ...

/home/mikeserv

전송 된 실제 이스케이프 시퀀스는 ...

kf6=\E[17~

흥미롭게도 >문자 를 포함하는 다른 이스케이프 시퀀스가 ​​있습니다 .

infocmp -1 | grep \>
is2=\E[!p\E[?3;4l\E[4l\E>,
rmkx=\E[?1l\E>,
rs2=\E[!p\E[?3;4l\E[4l\E>,

이들은 일반적으로 사용되는 이스케이프-재설정 및 초기화 문자열입니다. 대화식 쉘이 입력을 기다리고있을 때 키보드 나 버튼 스매쉬를 떨어 뜨리면 ~파일 시스템 전체 에서 무작위로 파일이 잘릴 수 있습니다 . 적어도 때로는 광산에서 자랍니다.

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