Ich möchte den Befehl ausführen
foo --bar=baz <16 zeroes>
Wie schreibe ich die 16 Nullen effizient *? Wenn ich gedrückt halte Altund drücke 1 6 0, wird es das nächste Mal 160 Mal wiederholt, was ich nicht will. In Emacs kann ich entweder Alt-[number]oder verwenden Ctrl-u 1 6 Ctrl-u 0, aber in bash wird Ctrl-udie aktuell eingegebene Zeile beendet, und die nächste Null fügt der Zeile nur eine 0 hinzu.
Wenn ich mache
foo --bar=baz $(printf '0%.0s' {1..16})
Dann history
zeigt genau das oben, und nicht foo --bar=baz 0000000000000000
; Bash verhält sich also nicht so, wie ich es will. ( Edit : point being, ich möchte eine Anzahl von Nullen eingeben, ohne die $(...)
Befehlssubstitution zu verwenden)
(*) Ich denke, eine technische Definition von "effizient" ist "mit O (log n) Tastenanschlägen", vorzugsweise eine Anzahl von Tastenanschlägen, die der Anzahl von Ziffern in 16 (für alle Werte von 16) plus vielleicht einer Konstanten entspricht; Das Emacs-Beispiel wird durch diese Definition als effizient eingestuft.
quelle
know what you want to do
. Woher weiß Bash in einem komplexen verschachtelten Befehl, welche Teile Sie das Ergebnis der Ausführung im Verlauf sehen möchten, im Gegensatz zum Befehl selbst? Was ist mit Variablen? Kurz gesagt, Bash wird immer dascode
in der Geschichte haben, nicht das Ergebnis der Ausführung des Codes.Alt
sendet an sich kein Zeichen, daher hat das Drücken und Loslassen von alt keine Auswirkungbash
.history
war, dass ich Ziffern eingeben möchte, ohne die Befehlsersetzung zu verwenden.Antworten:
Versuchen
Das sind 6 Tastenanschläge (vorausgesetzt eine US / UK QWERTY-Tastatur mindestens), um diese 16 Nullen einzufügen (Sie können halten) Alt sowohl 1 als auch 6 halten).
Sie können auch den Standardmodus
vi
(set -o vi
) verwenden und Folgendes eingeben:(auch 6 Tastenanschläge).
Der
emacs
äquivalente Modus, der verwendet werden könnte, um mehr als ein einzelnes Zeichen ( ) zu wiederholen, funktioniert in , aber nicht in .echo 0Ctrl+WAlt+1Alt+6Ctrl+Y
zsh
bash
Alle werden auch damit arbeiten
zsh
(undtcsh
woher das kommt). Mitzsh
können Sie auch Füllvariablen-Erweiterungsflags verwenden und diese erweitern mit Tab:(Offensichtlich viel mehr Tastenanschläge).
Mit
bash
können Sie auchbash
Ihre$(printf '0%.0s' {1..16})
mit erweitern Ctrl+Alt+E. Beachten Sie jedoch, dass es alles (aber keine Globs) in der Zeile erweitert.Um das Spiel mit der geringsten Anzahl von Tastenanschlägen zu spielen, können Sie ein Widget, das
<some-number>X
sichX
mehrmals wiederholt , an eine Taste binden<some-number>
. Und haben<some-number>
in Basis 36, um es noch weiter zu reduzieren.Mit
zsh
(gebunden an F8):Dann geben Sie für 16 Nullen Folgendes ein:
(3 Tastenanschläge), wo
g
sich16
in Basis 36 befindet.Jetzt können wir es weiter auf einen Schlüssel reduzieren, der diese 16 Nullen einfügt, obwohl das schummeln würde. Wir könnten F2an zwei
0
s (oder zwei$STRING
, standardmäßig 0), F3an 30
s und F1F6an 16 binden0
s ... bis zu 19 ... Möglichkeiten sind endlos, wenn Sie beliebige Widgets definieren können.Vielleicht sollte ich erwähnen, dass Sie, wenn Sie die 0Taste gedrückt halten , mit nur einem Tastendruck so viele Nullen einfügen können, wie Sie möchten :-)
quelle
vi
und andere!Angenommen, Ihr Terminal-Emulator nimmt den Tastenanschlag nicht wahr (z. B. um zwischen Registerkarten zu wechseln) Alt-1 6 Ctrl-V 0. Das Kontroll-V wird benötigt, um die Zahl und das zu wiederholende Zeichen aufzuteilen (wenn Sie einen Buchstaben wiederholen würden, würden Sie ihn nicht brauchen).
(Dies ist eine Readline-Funktion, die als bekannt
digit-argument
ist. Sie sollten also in der Lage sein,bind
die beteiligten Modifikatortasten zu ändern.)quelle
In Emacs würde ich normalerweise verwenden C-q, um das Präfixargument von der Zifferneingabe zu trennen.
Bash verwendet Ctrl+vstatt C-q, um Probleme mit der XON / XOFF-Flusssteuerung zu vermeiden.
So können Sie verwenden Alt+1 Alt+6 Ctrl+v 0.
quelle
Eine andere Möglichkeit besteht darin, vier Nullen einzugeben und diese dann noch dreimal mit der Maus zu kopieren und einzufügen. Doppelklicken Sie zum Auswählen, und klicken Sie zum Einfügen mit der mittleren Maustaste auf x 3.
quelle
Mit Makros spielen:
Binden Sie die Funktionstaste F8, um das letzte Wort (bis zum vorherigen Leerzeichen) mit zwei zu multiplizieren (F8-Tastencode gefunden mit
Ctrl-V F8
):Dies könnte dauerhaft gemacht werden, indem derselbe Text an gesendet wird
~/.inputrc
dann tippe:
2 ^ 4 mal die Null zu bekommen. (noch 5 Tastenanschläge).
oder Typ:
2 ^ 3 Buchwörter zu bekommen.
Noch schneller:
Mit 4 multiplizieren:
3 Tastendruck.
Mit 8 multiplizieren (die gleiche Zahl wie die Funktionstaste)
Noch 3 Tastendrücke.
Betrügen?
Cheat durch Multiplikation mit 16.
Nur 2 Tastendruck. (und immer noch eine nützliche einfache Funktion)
^^^^^^^^^^^^^^^ (Basis 36? Hah!) :-P
Betrügt einfach:
Nur 1 (ja: 1 ) Tastendruck.
Ändern der Bindung für ctrl+U:
Senden Sie dies an
~/.inputrc
:Lesen Sie die
~/.inputrc
Datei erneut:mach es wie es in emacs üblich ist (wie du wolltest):
7 Tasten (nach dem "Einrichten").
Etwas kürzer:
Verwenden Sie die Standardeinstellung "Multiplizieren mit 4" für "Universalargument" und enden Sie mit
Nur 5 Schlüssel.
Verwendung des alt+nZugriffs auf (arg: n)
Das sind 6 Schlüssel, um die 16 Nullen zu erhalten.
Keine Tastenkombination ändern:
Wenn Sie in Ihrer Bash haben
bash C-u kills the currently-being-typed line
.Das liegt daran,
"\C-u":
ist binden anunix-line-discard
.Das könnte aber auch helfen:
Wenn, was ist, bevor der Cursor gelöscht wird, wird es auch in den "Kill-Ring" gelegt.
Also
ctrl+u
löscht undctrl+y
reißt zurück, was gelöscht wurde.In einer sauberen Linie:
00
Geben Sie Erase It ein und ziehen Sie es zweimal zurück, um es zu erstellen0000
.Wiederholen Sie dies, um
00000000
(8 Nullen) zu erhalten, geben Sie schließlich den Befehl ein und ziehen Sie ihn zweimal zurück.Der erste Satz (7 Tasten ctrlgedrückt halten ):
Der zweite Satz (5 Schlüssel)
Das wird acht Nullen im Löschring bekommen, dann tippe was du willst:
bekommen:
Wenn Sie auf die Idee gekommen sind, können Sie auch eingeben , was Sie brauchen, zum Anfang der Zeile gehen ( ctrl-Y), wie oben beschrieben ctrl-Evorgehen (bis zu acht Nullen), bis zum Ende gehen ( ) und zweimal ziehen.
Das sind 15 Tasten (neben dem Befehl selbst).
Nicht kurz, ich weiß, aber das funktioniert nur mit dem, was verfügbar war.
Das ist etwas kürzer:
Das sind 11 Schlüssel
quelle
F<n>
wenn du das letzte Wort<n>
mal duplizierst .^[[19~
). Siehe"$(tput kf8)"
, um die Informationen aus der terminfo-Datenbank (oder dem$terminfo
Hash-Inzsh
) abzurufen .ctrl-v F8
Als Variation der Antwort von cas , Typ
und dann mit der Maus kopieren und einfügen (einmal). Möglicherweise ist dies O (log n), aber da es (len (str (n)) + 20) ist, können Sie es als ineffizient betrachten. Aber beachten Sie:%.s
scheint sich das genauso zu verhalten wie%.0s
.0000000000000000
als Argument ausführen möchten , müssen Sie dies nur einmal tun.Glenn jackman weist darauf hin , dass (wo Anzahl eine positive ganze Zahl) wird eine Zeichenfolge von Druck Anzahl Nullen (und einem Zeilenvorschub), wie das Sternchen in dem Format zeigt die Feldbreite von den Argumenten zu nehmen. Insbesondere werden 16 Nullen gedruckt. Dies ist jedoch ein Sonderfall, der nur behandelt wird . wird gedruckt , und wird gedruckt und eine Fehlermeldung. Im Gegensatz dazu erzeugen die anderen Befehle in dieser Antwort Zeichenfolgen wie oder (und siehe unten für ).
printf "%0*d\n" number 0
printf
printf "%0*d" 16 0
0
printf "%0*d" 16 12345
0000000000012345
printf "%0*d" 16 foo
0000000000000000
123451234512345…
foofoofoo…
7%7%7%...
Wenn Sie dies häufig tun, können Sie es optimieren, indem Sie eine Shell-Funktion definieren:
Anmerkungen:
$(seq 1 "$2")
anstelle von,(1.."$2"}
weil Letzteres nicht funktioniert - sehen Sie dies , dies , dies und das . Beachten Sie, dass einige der Antworten auf diese Fragen die Verwendung voneval
empfehlen, dies wird jedoch im Allgemeinen nicht empfohlen.$1%.0s
) muss in doppelten Anführungszeichen (und nicht in einfachen Anführungszeichen) angegeben werden, da sie einen Parameter ($1
) enthält.--
soll vor$1
Werten schützen , die mit beginnen-
."%.0s$1"
anstelle von verwenden"$1%.0s"
.$1
Wert, der enthält,%
dazu, dass er erstickt.Wenn Sie in der Lage sein müssen, mit
$1
Werten umzugehen%
, die Folgendes enthalten :Sobald Sie eine solche Funktion definiert haben, können Sie auch Dinge tun wie
Das ist etwas weniger tippen als
"$(printf '0%.0s' {1..16})"
.quelle
printf "%0*d" 16 0
werden 16 Nullen ausgegeben. Das Sternchen im Format nimmt die