当我运行以下一行循环时,我得到了预期的输出。
for index in $(seq 1 5) ; do echo "$(date +"%Y%m%d" -d "20160301 $index day")"; done
20160302
20160303
20160304
20160305
20160306
但是当我使用bash的edit-and-execute-command( control - x , control - e )并输入相同的一行循环,我得到输出,并在整个过程中回显意外命令。
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
我export EDITOR=vim
中有.bash_profile
。
更新更复杂的例子以回应来自@ l'L'l
的评论我正在使用子shell,因为真正的命令正在做更多的事情..
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
与更简单的示例一样,粘贴到命令行是可以的,但是使用edit-and-execute-command会在它们之间产生很多回声。
我已经通过使用脚本来解决这个问题(因为问题变得更加复杂),但是我仍然有兴趣知道是否有一个简单的解决方法(编辑和执行命令不会如果输出不清楚则看起来非常有用。)
答案 0 :(得分:4)
v
flag的内容之前
/* 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");
命令被打印到标准错误描述符。当它转向时,我们无法通过标准接口控制它。
但source
中的文件可以$EDITOR
,然后终止编辑器的进程:
#!/bin/bash -
vim "$@"
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
覆盖$EDITOR
变量后,将不再显示命令:
export EDITOR="/path/to/the-wrapper"