2016-08-11 2 views
4

Wenn ich die folgende Zeile-Schleife ausführen, bekomme ich die erwartete Ausgabe.Bash edit-and-execute-Befehl echo

for index in $(seq 1 5) ; do echo "$(date +"%Y%m%d" -d "20160301 $index day")"; done 
20160302 
20160303 
20160304 
20160305 
20160306 

Aber wenn ich bash edit-und-Ausführen-Befehl (Steuer - x, Steuer - e) verwenden und geben Sie die gleiche Leitungsschleife, ich Ausgabe mit unerwarteten Befehle hallte durch.

for index in $(seq 1 5) ; do echo "$(date +"%Y%m%d" -d "20160301 $index day")"; done 
seq 1 5 
date +"%Y%m%d" -d "20160301 $index day" 
20160302 
date +"%Y%m%d" -d "20160301 $index day" 
20160303 
date +"%Y%m%d" -d "20160301 $index day" 
20160304 
date +"%Y%m%d" -d "20160301 $index day" 
20160305 
date +"%Y%m%d" -d "20160301 $index day" 
20160306 

Ich habe export EDITOR=vim in meinem .bash_profile.


-Update mit komplizierterem Beispiel als Reaktion auf einen Kommentar von @ l'L'l

I Unterschalen benutzen, weil der eigentliche Befehl ist ein gutes Stück mehr zu tun ..

for index in $(seq 1 10) ; do td=`date +"%Y%m%d" -d "20160301 $index day"`; echo "$td: $(grep "$td" *gprs.csv | wc -l)" ; done 

Wie beim einfacheren Beispiel ist das Einfügen in die Befehlszeile OK, aber die Verwendung des Befehls edit-and-execute gibt viele Echos dazwischen.

Ich bin schon mit einem Skript daran vorbeigegangen (weil natürlich das Problem noch komplizierter wurde), aber ich bin immer noch interessiert zu wissen, ob es eine einfache Lösung dafür gibt (edit-and-execute-command doesn ' t scheint so nützlich, wenn die Ausgabe nicht klar ist).

+0

es vielleicht setzt 'set -v', wenn wir den Editor aufrufen. Als solche gehen sie zu 'stderr'. – anishsane

+1

Entfernen Sie das '' 'um den' date' Befehl: 'echo $ (date ...);'. –

+0

@RenaudPacalet: Der Befehl ist in Ordnung, obwohl es unklar ist, warum Sie eine Untershell benötigen, 'do date .. . 'sollte funktionieren. Getestet mit' vim', 'emacs' und' nano' - alle werden korrekt nach edit und exec ausgegeben. –

Antwort

2

Bash turns on the v flag vor Inhalt des temporary file Auswertung:

/* Turn on the `v' flag while fc_execute_file runs so the commands 
    will be echoed as they are read by the parser. */ 
begin_unwind_frame ("fc builtin"); 
add_unwind_protect ((Function *)xfree, fn); 
add_unwind_protect (unlink, fn); 
add_unwind_protect (set_verbose_flag, (char *)NULL); 
echo_input_at_read = 1; 

retval = fc_execute_file (fn); 
run_unwind_frame ("fc builtin"); 

Die Befehle werden gedruckt auf die Standardfehler Deskriptors. Wir können es jedoch nicht über die Standardschnittstelle steuern.

Aber es ist möglich, die Datei innerhalb des $EDITORsource, dann den Prozess des Editor beenden:

#!/bin/bash - 
vim "[email protected]" 

if [[ "$(basename "$1")" =~ bash-fc-[0-9]+ ]]; then 
    # Looks like edit-and-execute (C-x C-e) 

    # The user has finished editing the temporary file. 
    # It's time to evaluate the contents. 
    source "$1" 

    # Save current process ID for the subshell below. 
    pid=$PID 

    # The subshell helps to suppress the `Terminated` message. 
    (kill $pid >/dev/null 2>&1) 
fi 

Die Befehle werden nicht mehr nach Überschreiben der $EDITOR Variable angezeigt:

export EDITOR="/path/to/the-wrapper" 
+0

Schön! Danke.: D –