【问题标题】:How to "read" in bash without pressing enter如何在不按 Enter 的情况下在 bash 中“读取”
【发布时间】:2021-03-05 08:11:34
【问题描述】:

我已经完成了一个 shell (bash) 脚本,它将预定义的规则应用于放入终端的文件。

它工作得很好,但是因为它使用“读取”,所以一旦文件被拖放到术语窗口,它就需要按 Enter 键

这是当前代码的一部分

    while true ; do
        echo "Drop file(s) here then press [ENTER]:"
        echo "( x,q or exit,quit )"
        read -p "> " read_file
        while read dropped_file ;do
            if [ -e ${dropped_file} ] ; then
                ...bunch of code here...
            else
                [[ "${dropped_file}" == *[xXqQ]* ]] && exit 1
            fi
        done <<< $(echo ${read_file} | tr " " "\n")
        clear
    done

我不想在每次删除文件时按 Enter 键,我想知道是否有一些魔法可以避免与键盘交互,除非我想退出脚本

任何帮助将不胜感激

提前致谢

【问题讨论】:

  • 谢谢,这不是我要找的,但无论如何谢谢,我解决了使用 -n1 分解整个 file_path 然后重新组合它的问题
  • @MicheleFrau :您的程序不与键盘交互,它从标准输入读取,通常是一个文件,但如果没有提供文件,则绑定标准输入到您的 tty,后者又绑定到键盘。 bash 本身不知道“键”。正如您已经发现的那样,-n1 指示仅从标准输入读取一个字符。但是,我建议不要在设计应该处理标准输入的程序时假设“有人按下键”。另见here
  • @user1934428 感谢您的回复,但有一个误解,可能我表达得不好,因为英语不是我的主要语言,我认为我的代码 sn-p 是不言自明的;我的意图是将文件放到终端上以获取它们的文件路径,因此使用上面的代码,我自己而不是脚本,必须与键盘交互并按 Enter ;正如我进一步写的那样,我已经解决了使用 -n1 逐个字符分解删除的 file_path 字符,然后稍后重新组合它:既不优雅也不漂亮,但它完成了它的工作
  • 好吧,你没有与键盘交互。您还可以使用文本编辑器提供具有必要文件名和 x/q 命令的输入文件,并通过 stdin 提供此文件(无需重复的键盘输入)。我同意使用-n 1 不是一个优雅的解决方案,但这是你必须为丑陋的用户界面付出的代价。我会通过期望要删除的文件列表存储在单独的文件中(并将此文件传递给您的脚本)来设计脚本,或者接受要在命令行上删除的文件列表。

标签: bash shell


【解决方案1】:

我认为您可以使用 yes、printf 或 expect 命令并使用 \n 键,它应该能够执行您要查找的内容。

【讨论】:

    【解决方案2】:

    编辑

    我已经解决了这个问题

    while true ; do
        read -sn1 read_file
        while read splitted_filename; do
        dropped_file="${dropped_file}${splitted_filename}"
        done <<< $(echo ${read_file})
        functionAction
        [[ "${dropped_file}" == [xXqQ] ]] && exit 1
    done 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      相关资源
      最近更新 更多