gpt4 book ai didi

linux - 与子shell命令交互时如何使ctrl + c取消整个命令?

转载 作者:行者123 更新时间:2023-12-05 05:17:43 24 4
gpt4 key购买 nike

我有一个简单的 shell 别名

alias fz='vim -p $(fzf -m)'

fzf 是一个交互式终端程序,只有在它终止时才会在标准输出上发送文件名列表。这然后用于打开用 vim 选择的文件。

现在的问题是,当我决定取消并按下 ctrl+c 时,shell 继续前进并仍然打开 vim(就好像我刚刚运行了 vim -p)。这是有道理的。

现在,解决我眼前的问题的一个方法是简单地使我的别名更复杂,以便在 fzf 的输出为空时它不会启动 vim。或者,如果 fzf 的退出代码不为零,我可能会做一些事情来中止启动 vim。

但是,我很好奇当我 Ctrl + C 时如何命令我的 shell 终止此 fz。当我在子 shell 上下文中时,这根本不可能吗?我可以通过某种方式设置进程组 ID 来实现吗?

我尝试了 set -m,但它没有改变行为。

最佳答案

当您使用 Ctrl + C 提早退出时,使调用 fzf(或任何其他命令)的脚本退出

1。简单别名

这个有效:

# command
files_list=$(fzf -m) && vim -p $files_list

# alias
alias fz='$(fzf -m) && vim -p $files_list'

解释:

fzf正常退出时返回错误码0(注:退出后可以通过运行echo $?读取返回码).但是,当 fzfCtrl + C 杀死时,它返回错误代码 130&& 部分的意思是“如果左边的部分为零,则只执行右边的部分”——意思是左边的命令成功完成。因此,当您在 fzf 运行时按 Ctrl + C 时,它会返回错误代码 130,并且部分右边永远不会执行。

2。更强大的功能

但是,如果您需要做任何更复杂的事情,请使用一个函数(如果您愿意,可以在您的 ~/.bashrc~/.bash_aliases 文件中)而不是别名。这是上面别名的一个更强大的例子,以函数形式。 我在上面写别名的方式,如果你的文件名中有空格或奇怪的字符,我预计它会失败。但是,即使在我认为的那些情况下,下面的函数也应该工作: p>

fz() {
files_list="$(fzf -m)"
return_code="$?"

if [ "$return_code" -ne 0 ]; then
echo "Nothing to do; fzf return_code = $return_code"
return "$return_code"
fi

echo "FILES SELECTED:"
echo "$files_list"

# Convert the above list of newline-separated file names into an array
# - See: https://stackoverflow.com/a/24628676/4561887
SAVEIFS=$IFS # Save current IFS (Internal Field Separator)
IFS=$'\n' # Change IFS to newline char
files_array=($files_list) # split this newline-separated string into an array
IFS=$SAVEIFS # Restore original IFS

# Call vim with each member of the array as an argument
vim -p "${files_array[@]}"
}

注意:如果您不熟悉 [ 函数(是的,那是一个函数名!),请运行 man [man test了解更多信息。 [ 函数也称为 test。这就是为什么函数名之后的参数之间需要空格——它们是函数的参数! ] 符号只是 [ (test) 函数所需的结束参数。

引用资料:

  1. 我的 array_practice.sh 存储库中的 eRCaGuy_hello_world bash 脚本。这是我学习和记录大量此类内容的地方。
  2. 如何将参数数组传递给命令:How can I create and use a backup copy of all input args ("$@") in bash?
  3. 如何将换行符分隔的字符串解析为元素数组:Convert multiline string to array
  4. 使用return 提前退出 bash 函数:How to exit a function in bash

关于linux - 与子shell命令交互时如何使ctrl + c取消整个命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48891543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com