bash에서 아직 실행되지 않은 문자열의 일부를 반복하는 것이 가능합니까?

bash에서 아직 실행되지 않은 문자열의 일부를 반복하는 것이 가능합니까?

같은 줄(예: 링크)에서 명령의 일부(아직 실행되지 않음)를 반복할 수 있는지 알고 싶습니다.

이 명령을 실행하고 싶다고 가정해 보겠습니다.

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 라인 편집에도 동등한 기능이 있다고 가정합니다 .)mkdiryWpemacs

또는,

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
  • !:0= ls,
  • !:1= -l
  • !:2= 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"라면 이것은 실제로 더 많은 타이핑을 의미합니다.

관련 정보