Bash에서 명령의 일부만 반복하는 방법은 무엇입니까?

Bash에서 명령의 일부만 반복하는 방법은 무엇입니까?

반복이 가능한지 알고 싶습니다.부분명령. 즉, 이렇게 하면 및 ls /path/to/somewhere -a만 제거하고 싶습니다 .ls-a

!!이렇게 하면 이전 명령이 반복되고(이전에 작성한 명령에 마지막 명령을 추가함), 이렇게 하면 문자열의 마지막 부분이 포함된다는 것을 알고 있지만 !$알고 싶습니다. 예를 들어 이전 명령의 중간 부분만 다시 사용할 수 있습니다.

답변1

물론, 사용!^

예를 들어

$ ls /path/to/somewhere -a
ls: cannot access '/path/to/somewhere': No such file or directory
$ echo !^
echo /path/to/somewhere
/path/to/somewhere
$

또는 (추가 키 입력으로 인해) 를 사용할 수 있습니다 !:1.

$ ls /path/to/somewhere -a
ls: cannot access '/path/to/somewhere': No such file or directory
$ echo !:1
echo /path/to/somewhere
/path/to/somewhere
$

이것은이벤트 표시기그리고단어 표시기부분bash 매뉴얼 페이지.

답변2

확장됨@스티브의 답변일반 요구 사항을 충족하려면:

이전 명령의 중간 부분만 다시 사용할 수 있는지 궁금합니다.

여러 단어 범위를 사용하여 이전 명령을 다시 정렬할 수 있습니다.

  • !:x, x 번째 단어를 복원하려면 첫 번째 단어가 0번째 단어입니다.
  • !:x-y, x번째 단어 부터 y 번째 단어 까지 복원

예를 들어:

$ ls /foo /bar -a /baz >/dev/null 2>&1
$ echo !:1-2 !:4
echo /foo /bar /baz
/foo /bar /baz

리디렉션 연산자는 다음과 같이 계산됩니다.개인의, 그래서:

$ ls /foo >/dev/null 2>&1
$ echo !:3 !:2
echo /dev/null >
bash: syntax error near unexpected token `newline'

색인별 단어 선택은 최신 명령 이외의 명령에 적용하도록 추가로 확장될 수 있습니다.

  • !-n, n번째 가장 최근 명령 선택
  • !string, 다음으로 시작하는 가장 최근 명령을 선택하세요.string

따라서 이들을 결합하면 다음과 같은 결과를 얻을 수 있습니다.

$ cat /foo -vet >/dev/null 2>&1
$ ls /bar -a >/dev/null 2>&1
$ cp !cat:1 !ls:1-2 >/dev/null 2>&1
cp /foo /bar -a

나는 명령 기록을 배열(명령줄, 단어 열)로 생각하는 경향이 있는데, 이는 이러한 종류의 탐색을 자연스럽게 만듭니다.

참고: 이전 명령의 일부를 연결하여 새 명령을 만들면 해당 명령이 되돌릴 수 없는 영향을 미칠 수 있습니다. :p빌드된 명령을 호출하는 대신 매개변수를 넣어 표시하는 것이 좋습니다 .

예를 들어: rm !ls:1-4:p. 가장 최근 명령rm 의 첫 번째부터 네 번째 인수까지 삽입한 후 최종 명령을 인쇄합니다 .ls

답변3

배쉬에는 하나가 있습니다yank-last-arg명령 기록 처리 명령:

yank-last-arg (M-. 또는 M-_)

이전 명령(이전 기록 항목의 마지막 단어)에 마지막 인수를 삽입합니다. 숫자 매개변수의 경우 동작은 정확히 동일합니다 yank-nth-arg. 연속적인 호출은 yank-last-arg기록 목록에서 뒤로 이동하여 각 줄의 마지막 단어(또는 첫 번째 호출에 대한 인수로 지정된 단어)를 순차적으로 삽입합니다. 이러한 연속 호출에 제공된 숫자 인수는 기록이 이동되는 방향을 결정합니다. 인수를 부정하면 기록의 방향(뒤로 또는 앞으로)이 전환됩니다. 기록 확장 도구는 마치 !$기록 확장이 지정된 것처럼 마지막 인수를 추출합니다.

기본 키 바인딩을 사용하면 을 눌러 활성화할 수 있습니다 Meta.. 1 가장 최근 명령의 마지막 단어를 커서 위치에 복사합니다 .

복사하다N마지막 단어 대신 첫 번째 단어를 누른 다음Metan 를 누릅니다 Meta..

찾아보니 이거보다역사적 확장, 대화형으로 작동하기 때문입니다.


이전 명령을 대화식으로 조정하는 또 다른 방법은 다음을 사용하는 것입니다.edit-and-execute-command특징:

명령 편집 및 실행(Cx Ce)

현재 명령줄에서 편집기를 호출하고 결과를 셸 명령으로 실행합니다. Bash는 $VISUAL, $EDITOR및 편집기를 순서대로 호출하려고 시도합니다 .emacs

위쪽/아래쪽 화살표 키를 사용하여 명령을 호출한 다음 , 에서 을 누릅니다 CtrlX. CtrlE그런 $EDITOR다음 원하는 대로 명령을 편집할 수 있으며 편집기를 저장하고 종료하면 실행됩니다.


1키보드 레이아웃에 따라Meta 이는 키를 길게 누르거나 Alt, Option키를 누르고 있거나, Esc키를 눌렀다가 떼는 것을 의미할 수 있습니다. .여기에서 읽는 데 어려움이 있는 경우를 대비하여 마침표 또는 마침표 문자입니다 .

답변4

위쪽 화살표. 그런 다음 backspace일부 문자를 삭제하십시오. Ctrl+A줄의 시작 부분으로 이동하여 DEL일부 문자를 삭제합니다. 전체적으로 시각적 피드백이 제공되며 추측이 필요하지 않습니다. Ctrl+E줄 끝으로 다시 이동합니다.

관련 정보