같은 줄(예: 링크)에서 명령의 일부(아직 실행되지 않음)를 반복할 수 있는지 알고 싶습니다.
이 명령을 실행하고 싶다고 가정해 보겠습니다.
mkdir -p /some/long/dest/path && rsync -azP /some/long/src/path /some/long/dest/path
다음과 같이 입력하는 것이 가능합니까?
mkdir -p /some/long/dest/path && rsync -azP /some/long/src/path /path/at/x:2
분명히 x:2
배열의 인덱스는마지막으로 실행된 명령, 그래서 문자열을 함께 연결하고 명령을 재사용할 수 있는지 궁금합니다.x
현재 문자열 위치입니다.
답변1
라인 편집을 사용하여 매개변수를 가져와 mkdir
라인 끝에 붙여넣을 수 있습니다. (저는 vi
-style 라인 편집을 사용하므로 매우 간단합니다. ESC를 눌러 편집 모드로 들어가서 해당 경로 0WW
로 점프 하고 경로를 끌어온 다음 붙여넣습니다. default -style 라인 편집에도 동등한 기능이 있다고 가정합니다 .)mkdir
yW
p
emacs
또는,
p=/some/long/dest/path; mkdir -p "$p" && rsync -azP /some/long/src/path/ "$p"
아니면 대화형 세션이므로 mkdir
결과를 확인하세요.검사 통과:
mkdir -p /some/long/dest/path
rsync -azP /some/long/src/path/ !$
이전에 발생한 적이 없다면 마지막 명령의 마지막 인수( )를 !$
바꿀 수 있습니다 . (다른 것 중에서) $
에 있습니다 man bash
. 시도해 보고 어떻게 진행되는지 확인하세요.
date --date tomorrow
echo !$
date --date !$
프로젝트는 처음부터 참조됩니다 echo !!:0
.
그 주장을 어떻게 인용해야 할지 모르겠습니다.현재의이 스타일 연산자와 함께 명령줄을 사용하십시오 history
.
답변2
나는 기억할 만큼 나이가 들었다하드 카피 터미널 (아이들을 위해 키보드가 있는 프린터를 상상해 보십시오.) 그리고 저는 이 편집기 스타일의 명령줄 편집이 오래 가지 못할 유행이라고 믿습니다. :-)
하지만 솔직히 말해서,이해합니다인간형 명령의 역사를 들어본 사람은 나뿐만이 아니다 !
. 그것은 몇 가지 세부 사항에서 논의됩니다. 큰 타격(1);보다 역사부분. 다음은 간단한 요약입니다(예: 일반 형식에 대한 몇 가지 힌트가 포함된 예제 목록).
문법/ 예제 |
설명/해설 |
---|---|
!number ;!42 |
로그인 이후 42번째 명령어입니다. 또는 오히려 history 목록의 42번째 명령이 삭제되거나 잘리면 상황이 복잡해집니다. |
!-number , ,!-1 !-2 !-42 |
상대 주소 지정. !-1 는 가장 최근 명령이고, !-2 는 이전 명령 등입니다. -1 기본값은 !-1 축약될 수 !! 있으며(아래 참조) 축약될 수 있습니다.!-1:something !:something |
thing1:thing2 |
thing1 수정됨. 하나의 사물에 여러 수정자가 있을 수 있습니다. 아래 예를 참조하세요.thing2 |
:number |
이것N첫 번째 단어. ~처럼 엠마 루오 라고, 단어 번호 매기기는 0부터 시작하므로 이전 명령 ls -l foo 이
|
:$ |
마지막 단어. ~처럼 엠마 루오 쇼설명은 필요 없고 :$ 줄여서 쓰면 됩니다 $ . |
:h |
머리도 마찬가지야...dirname . |
:t |
꼬리; 똑같아...basename . |
잘 알려지지 않은 구조 중 하나는 !#
참조 입니다.이것 현재 명령. 그래서 당신의
mkdir -p /some/long/dest/path && rsync -azP /some/long/src/path /some/long/dest/path
명령은 다음과 같이 입력할 수 있습니다.
mkdir -p /some/long/dest/path && rsync -azP /some/long/src/path !#:2
두 번째 단어( ) 는 어디서 !#:2
구할 수 있나요 ?/some/long/dest/path
이것주문하다.
그리고 rsync
예제에서 볼 수 있듯이 매개변수가 실제로 거의 인접해 있는 경우 한 단계 더 나아가 다음과 같이 말할 수 있습니다.
mkdir -p /some/long/dest/path && rsync -azP !#:2:h:h/src/path !#:2
다음은 !#:2:h:h
여러 수정자가 있는 항목의 예입니다 — dirname(dirname(!#:2))
= /some/long
. 한 단계 더 나아갈 수도 있습니다.
mkdir -p /some/long/dest/path && rsync -azP !#:2:h:h/src/!#:2:t !#:2
그러나 basename(!:2)
이것이 실제로 문자 그대로의 " path
"라면 이것은 실제로 더 많은 타이핑을 의미합니다.