如何在 zsh 中交互运行文件中的所有命令?

如何在 zsh 中交互运行文件中的所有命令?

我碰到这个问题。它要求一种以交互方式运行文件中所有命令的方法。

一个答案建议使用bash这样的脚本:

#!/usr/bin/bash                                                                
                                                                               
while IFS= read -r -u3 cmd
do
    read -e -i "$cmd" -p "$USER $ " cmd
    eval $cmd
done 3<$1

我想知道是否可以使用 来实现相同的效果zsh,因为我想要source脚本,以便我可以保留文件中声明的变量。

答案1

run_carefully() {
  # Take the first arg as a file name, read the file and split it on newlines.
  local cmd; for cmd in ${(f)"$(<$1)"}; do
    # Let the user edit (or delete) the command, before evaluating it.
    vared cmd
    eval "$cmd"
  done
}

或者,我们可以让用户在一次运行所有命令之前编辑整个命令列表:

run_all_carefully() {
  # Take the first arg as a file name and read the file.
  local list="$(<$1)"

  # Let the user edit the list of commands, before evaluating it.
  vared list
  eval "$list"
}

请注意,在这两种情况下,Enter都将接受整个编辑,而AltEnter插入换行符而不退出编辑器。对于第二种情况,所有命令都会立即编辑,您可能需要设置自己的键盘映射(通过选项传递给 vared -M),在其中交换这两个命令。

文档:

相关内容