我正在尝试通过将文件名称粘贴到 while 循环中来从目录中删除文件,该循环将简单地从给定的文件列表中删除每个项目。
$ sponge | while read file; do echo "rm $file"; rm "$file"; done;
background.bundle.js
964.bundle.js
background.bundle.js.LICENSE.txt
...
META-INF/manifest.mf
META-INF/mozilla.sf
META-INF/mozilla.rsa
^D
rm background.bundle.js
rm: remove regular file ‘background.bundle.js’? $
$
(注意最后的 ^D)
如图所示,在发出 ^D(文件结束符)后,sponge 命令将整个输出发送到 while 循环,并为每个文件分别调用 rm。然而,实际发生的情况是,它只为 background.bundle.js 调用一次,要求确认,而我却没有机会输入任何内容,循环就提前退出了。这导致提示符 ($) 后面没有必要的换行符,表明循环突然结束。
我希望在不使用临时文件的情况下修复此问题。我想使用 exec 管理文件输入,以便循环从不同的输入流读取,让标准输入可供 rm 读取用户的确认。为此,我如何将 sponge 输出和读取输入重定向到特定的文件描述符?
如果意图是在没有确认的情况下删除文件,则
rm
实际上是一个别名或类似于此的功能:然后使用命令(1p)实用程序将绕过别名/函数:
如果目的是在子 shell 中强制从终端输入,则可以使用一种感觉有点“hacky”的解决方案:仅从/dev/tty(代表当前进程的控制终端的设备)重新分配 rm(1) 的标准输入:
笔记:
while
是while IFS= read -r ...; do ...; done
。