대화식으로 bash에 숫자의 n 반복을 입력하는 방법


20

명령을 실행하고 싶습니다

foo --bar=baz <16 zeroes>

16 개의 0을 효율적으로 입력하려면 어떻게합니까? 내가 누르고 있으면 Alt누르 1 6 0내가 원하지 무엇을하는 다음 일은 160 번 반복합니다. emacs에서는 Alt-[number]or을 사용할 수 Ctrl-u 1 6 Ctrl-u 0있지만 bash Ctrl-u에서는 현재 유형이 지정된 줄을 죽이고 다음 0은 줄에 0을 추가합니다.

만약 내가한다면

foo --bar=baz $(printf '0%.0s' {1..16})

그런 다음 history정확하게 위를 보여줍니다 foo --bar=baz 0000000000000000. 즉, bash는 내가 원하는 방식으로 동작하지 않습니다. ( 편집 : 포인트, $(...)명령 대체 를 사용하지 않고 몇 개의 0을 입력하고 싶습니다 )

(*) "효율적으로"의 기술적 정의는 "O (log n) 키 스트로크 사용", 바람직하게는 16의 모든 자릿수 (16의 모든 값에 대한)와 + 상수와 같은 키 스트로크의 수와 같다고 생각합니다. emacs 예제는이 정의에 의해 효율적으로 규정됩니다.


1
bash가 어떻게 든 원하는 것처럼 들립니다 know what you want to do. 복잡한 중첩 명령에서 bash는 명령 자체와 달리 실행 기록에서 실행 결과를 보려는 부분을 어떻게 알 수 있습니까? 변수는 어떻습니까? 간단히 말해서 bash는 code코드 실행 결과가 아니라 항상 히스토리 에 있어야합니다 .
Unbeliever

@meuh Alt는 그 자체로 문자를 보내지 않으므로 alt를 눌렀다 놓아도 아무 효과가 없습니다 bash.
Stéphane Chazelas

1
@Unbeliever 내 뜻대로하고 괜찮아 질거야
cat

@Unbeliever : 편집 내용을 참조하십시오. 단락과 관련된 요점은 history명령 대체를 사용하지 않고 숫자를 입력하고 싶었습니다.
Jonas Kölker

자동 입력을 원할 때마다 AutoKey를 사용하는 것이 좋습니다. 이를 통해 구문 대체를 만들거나 트리거 구문을 입력하거나 단축키를 누를 때 원하는 거의 모든 작업을 수행하는 완전한 Python 매크로를 만들 수 있습니다. GUI 데스크탑 환경이 필요하고 나머지 답변은 그렇지 않으므로 더 일반적으로 적용 가능하기 때문에 이것을 답변으로 포함시키지 않았습니다.
Joe

답변:


25

시험

에코 Alt+1Alt+6Ctrl+V0

그것은 16 개의 0을 삽입하는 6 개의 키 스트로크 (최소한 US / UK QWERTY 키보드를 가정 Alt)입니다 (1과 6을 모두 보유 할 수 있음 ).

표준 vi모드 ( set -o vi)를 사용하고 다음을 입력 할 수도 있습니다 .

에코 0 Escx16p

(또한 6 번의 키 스트로크).

emacs모드에 해당하고는 단일 문자보다 더 반복하는 데 사용할 수는 ( )에서 작동 하지만, NOT IN .echo 0Ctrl+WAlt+1Alt+6Ctrl+Yzshbash

모든 사람들은 함께 작동합니다 zsh(및 tcsh그 출처). 로 zsh패딩 변수 확장 플래그를 사용하고 다음과 Tab같이 확장 할 수 있습니다 .

에코 $ {(l : 16 :: 0 :)}Tab

(분명히 더 많은 키 입력).

와 함께 bash, 당신은 또한 수 있습니다 bash귀하의 확장 $(printf '0%.0s' {1..16})과 함께 Ctrl+Alt+E. 그러나 라인의 모든 것을 확장 할 수 있습니다.

키 스트로크의 최소 숫자의 게임을 재생하려면, 당신은 몇 가지 중요한로 확장하는 위젯 결합 수 <some-number>XX반복 <some-number>번. 그리고 <some-number>36을 더 줄이십시오.

zsh( F8) :

repeat-string() {
  REPLY=
  repeat $1 REPLY+=$2
}
expand-repeat() {
  emulate -L zsh
  set -o rematchpcre
  local match mbegin mend MATCH MBEGIN MEND REPLY
  if [[ $LBUFFER =~ '^(.*?)([[:alnum:]]+)(.)$' ]]; then
    repeat-string $((36#$match[2])) $match[3]
    LBUFFER=$match[1]$REPLY
  else
    return 1
  fi
}
zle -N expand-repeat
bindkey "$terminfo[kf8]" expand-repeat

그런 다음 16 개의 0에 대해 다음을 입력하십시오.

에코 g0F8

(3 키 입력) 여기서 g16베이스 (36).

이제 우리는 16 개의 0을 삽입하는 키 하나를 키로 줄일 수 있습니다. 우리는 결합 할 수 F2두에 0의 (또는 2 $STRING기본적으로, 0), F3(3) 0, S F1F6(16 개) 0는 임의의 위젯을 정의 할 수 있습니다 때 19의 ... 최대 ... 가능성은 무한합니다.

어쩌면 나는 0키 를 누르고 있으면 한 번의 키 입력으로 원하는만큼 0을 삽입 할 수 있다고 언급해야합니다 :-)


다양한 변형을 제공해 주셔서 감사 vi합니다!
Mark Stewart

9

터미널 에뮬레이터에서 키 입력 (예 : 탭 전환) (일반 xterm 작업)을 먹지 않는다고 가정하면을 누를 수 있습니다 Alt-1 6 Ctrl-V 0. 숫자와 문자를 반복하기 위해 control-V가 필요합니다 (문자를 반복하는 경우 필요하지 않습니다).

(이것은로 알려진 readline 기능 digit-argument이므로 bind관련된 수정 자 키를 변경하는 데 사용할 수 있어야합니다 )


1
기능 이름을 포함하면 나와 같은 사람들이이 질문에 걸려 넘어 질 때 유용합니다. : 좀 더 읽기에 대한 관련 링크 SO 질문수동 강타
admalledd

4

Emacs에서는 일반적으로 C-q접두사 인수를 숫자 입력과 구분 하는 데 사용 합니다.

XON / XOFF 흐름 제어 문제를 피하기 위해 Bash Ctrl+v대신을 사용 합니다 C-q.

사용할 수 있습니다 Alt+1 Alt+6 Ctrl+v 0.


3

다른 옵션은 네 개의 0을 입력 한 다음 마우스를 사용하여 세 번 더 복사하여 붙여 넣는 것입니다. 두 번 클릭하여 선택하고 x 3을 가운데 클릭하여 붙여 넣습니다.


또는 골프가 /을 입력하여 좀 더 속이 하나의 제로 선택 & 2를 얻기 위해 그 붙여 넣기; 그것을 선택하고 붙여 넣어 4를 얻으십시오. 선택 및 팔에 붙여, 다시 16 것은 :) 강력
제프 쉘러

예, 그러나 4 개의 0을 입력하고 반복 붙여 넣기를하면 최적의 노력과 보수를 얻을 수 있습니다. 여분의 복사 및 붙여 넣기는 모두 작업처럼 보입니다.
cas

3

매크로로 재생 :

기능 키 F8를 바인드하여 마지막 단어 두 개 (이전 공백까지)를 사용하십시오 (F8 키 코드를 사용하여 찾음 Ctrl-V F8).

$ bind '"\e[19~": "\C-w\C-y\C-y"'

같은 텍스트를 보내서 영구적으로 만들 수 있습니다. ~/.inputrc

$ echo '"\e[19~": "\C-w\C-y\C-y"' >> ~/.inputrc

다음을 입력하십시오.

에코 0F8F8F8F8

0의 2 ^ 4 배를 얻습니다. (여전히 5 번의 키 입력).

또는 유형 :

에코 북F8F8F8

2 ^ 3 개의 책 단어를 얻으려면.

여전히 더 빠름 :

4를 곱하십시오.

$ bind '"\e[19~": "\C-w\C-y\C-y\C-w\C-y\C-y"'

에코 0F8F8

3 키 누름.

8을 곱하십시오 (기능 키와 같은 숫자)

$ bind '"\e[19~": "\C-w\C-y\C-y\C-w\C-y\C-y\C-w\C-y\C-y"'

에코 00F8

여전히 3 번의 키 누르기.

사기?

16을 곱하여 치트하십시오.

$ bind '"\e[19~": "\C-w\C-y\C-y\C-w\C-y\C-y\C-w\C-y\C-y\C-w\C-y\C-y"'

에코 0F8

키를 2 번만 누르십시오. (그리고 여전히 유용한 간단한 함수)

^^^^^^^^^^^^^^^^ (base 36? Hah!) :-P

명백히 부정 행위 :

$ bind '"\e[19~": "0000000000000000"'

에코 F8

키 입력은 1 (예 : 1 )입니다.



의 바인딩 변경 ctrl+U:

이것을 다음으로 보내십시오 ~/.inputrc:

echo '"\C-u": universal-argument >> ~/.inputrc

~/.inputrc파일을 다시 읽으십시오 .

ctrl+Xctrl+R

emacs에서 평소대로 (원하는대로)하십시오 :

foo --bar = baz ctrl+U16 ctrl+U0

7 개의 키 ( "설정 후").

약간 짧게 :

"universal-argument"의 기본값 "4에 곱하기"를 사용하고

 ctrl+V 0 

foo --bar = baz ctrl+Uctrl+Uctrl+V0

5 개의 키만 있습니다.

에 대한 alt+n액세스 사용 (arg : n)

foo --bar = baz Alt+16Ctrl+V0

16 개의 0을 얻기위한 6 개의 키입니다.

키보드 단축키를 변경하지 않음 :

당신의 배쉬에 있다면 bash C-u kills the currently-being-typed line.
그것은 "\C-u":bind에 있기 때문 입니다 unix-line-discard.

그러나 이것은 또한 도움이 될 수 있습니다.
커서가 지워지기 전의 내용은 "kill-ring"에도 배치됩니다.

따라서 지워진 것을 ctrl+u지워 ctrl+y버립니다.
깨끗한 라인에서 : 00그것을 지우고 다시 두 번 잡아 당겨서 만드십시오 0000.
반복해서 00000000(8 개의 0), 마지막으로 명령을 입력하고 두 번 뒤로 k니다.

첫 번째 세트 (7 개의 키를 계속 ctrl누르고 있음) :

00 ctrl+Uctrl+Yctrl+Y ctrl+U 

두 번째 세트 (5 개 키)

ctrl+Uctrl+Yctrl+Y ctrl+U 

지우개 링에 8 개의 0이 생기고 원하는 것을 입력하십시오.

 foo --bar = baz ctrl-Y ctrl-Y 

얻을 :

foo --bar=baz 0000000000000000

아이디어를 얻은 후에도 필요한 것을 입력하고 줄의 시작으로 이동하고 ( ctrl-Y) 위와 같이 (최대 8 개의 0으로) 끝으로 이동하여 ( ctrl-E) 두 번 yan 수 있습니다.

foo --bar = baz ctrl-A00ctrl-Uctrl-Yctrl-Y ctrl-Uctrl-Yctrl-Y ctrl-U ctrl-Ectrl-Yctrl-Y

그것은 15 키입니다 (명령 자체 제외).
짧지는 않지만 알고 있지만 사용 가능한 기능으로 만 작동합니다.

조금 짧습니다.

0000 ctrl-U ctrl-Y ctrl-Y ctrl-Y ctrl-Yctrl-A foo --bar = baz

11 키야


내 답변의 편집 참조 ;-)
Stéphane Chazelas

@ StéphaneChazelas 매크로를 사용하십니까? 기지 36? zsh에서만? C'mon ... 내 편집보기 :
-P

글쎄요, base36은 약간 혀였습니다. 나는 당신 F<n>이 마지막 단어 <n>시간을 복제하는 것을 좋아합니다 .
Stéphane Chazelas

GNU / 리눅스 시스템에서 찾은 대부분의 터미널은 F8에서 모든 터미널이 동일한 시퀀스를 보내는 것은 아닙니다 ^[[19~. "$(tput kf8)"terminfo 데이터베이스 (또는 $terminfo해시)에서 정보를 얻으려면 참조하십시오 zsh.
Stéphane Chazelas

@ StéphaneChazelas 네, 맞습니다. 또는 간단히 사용하십시오ctrl-v F8
sorontar

2

cas의 답변의 변형으로 다음 을 입력하십시오.

printf '0 % .s'{1..16}Enter
그런 다음 마우스를 사용하여 복사하여 붙여 넣습니다 (한 번). 아마도 이것은 O (log n)이지만 (len (str (n)) + 20)이므로 비효율적 인 것으로 간주 할 수 있습니다. 그러나 참고 :

  • 나는 하나 개의 문자 면도 할 수 있었다 - 내 시스템에, %.s같은 행동을 보인다 %.0s.
  • 0000000000000000인수로 여러 명령을 실행 하려면이 작업을 한 번만 수행하면됩니다.

밖으로 글렌 잭맨 포인트 가 (여기서 숫자는 양의 정수)의 캐릭터 인쇄 할 제로 (과 줄 바꿈) 형식으로 별표 지시로 인수에서 필드 폭을 촬영합니다. 특히 16 개의 0을 인쇄합니다. 그러나 이것 처리하는 특별한 경우입니다 .  인쇄합니다 및 인쇄 할 수 및 오류 메시지. 대조적으로,이 답변의 다른 명령은 또는 같은 문자열을 생성합니다 (아래 참조 ).printf "%0*d\n" number 0printfprintf "%0*d" 16 0 0printf "%0*d" 16 123450000000000012345printf "%0*d" 16 foo0000000000000000123451234512345…foofoofoo…7%7%7%...

이 작업을 자주 수행하려는 경우 쉘 기능을 정의하여 간소화 할 수 있습니다.

rep() { printf -- "$1%.0s" $(seq 1 "$2"); printf "\n"; }

노트:

  • 후자는 작동하지 않기 때문에 $(seq 1 "$2")대신 사용 (1.."$2"}하십시오. this , this , thisthis를 참조하십시오 . 해당 질문에 대한 답변 중 일부는을 사용하는 eval것이 좋지만 일반적으로 권장되지는 않습니다.
  • 형식 문자열 ( $1%.0s)은 매개 변수 ( $1)를 포함하므로 작은 따옴표 대신 큰 따옴표로 묶어야합니다 .
  • --방지하는 것입니다 $1로 시작하는 값 -.
  • "%.0s$1"대신을 사용하여 비슷한 보호 기능을 얻을 수 "$1%.0s"있습니다.
  • 어느 쪽이든, $1값을 포함 %하면 값 이 질식합니다.
  • $1포함하는 값 을 처리 할 수 ​​있어야 하는 %경우

    rep() { local i; for ((i=0; i<$2; i++)); do printf '%s' "$1"; done; printf "\n"; }

또한 일단 그러한 함수가 정의되면 다음과 같은 작업을 수행 할 수 있습니다

foo --bar=baz "$(rep 0 16)"

입력하는 것보다 약간 적습니다 "$(printf '0%.0s' {1..16})".


또는 printf "%0*d" 16 016 개의 0을 인쇄합니다. 형식 별표는 인수에서 필드 너비를 취할 것입니다
글렌 잭맨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.