대화식으로 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>X에 X반복 <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 키 입력) 여기서 g인 16베이스 (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 , this 및 this를 참조하십시오 . 해당 질문에 대한 답변 중 일부는을 사용하는 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.