bash edit-and-execute-command echo

时间:2016-08-11 05:37:52

标签: bash

当我运行以下一行循环时,我得到了预期的输出。

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会在它们之间产生很多回声。

我已经通过使用脚本来解决这个问题(因为问题变得更加复杂),但是我仍然有兴趣知道是否有一个简单的解决方法(编辑和执行命令不会如果输出不清楚则看起来非常有用。)

1 个答案:

答案 0 :(得分:4)

在评估turns on the v flag的内容之前

重击temporary file

/* 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"