是否有标准的海绵替代品可将文件通过管道传输到自身中?

argentum2f

我经常想做这样的事情:

 cat file | command > file

(这显然不起作用)。我为此看到的唯一解决方案是sponge,即

 cat file | command | sponge file

不幸的是,sponge它对我不可用(我也无法安装它或任何其他软件包)。

是否有一种更标准的快速方法来执行此操作,而不必每次都将其分解为多个命令(通过管道传输到临时文件,通过管道传输回原始文件,删除临时文件)?tee例如,我尝试过,它似乎可以工作,但这是一个一致/安全的解决方案吗?

库萨兰达

一个shell函数替换sponge

mysponge () (
    append=false

    while getopts 'a' opt; do
        case $opt in
            a) append=true ;;
            *) echo error; exit 1
        esac
    done
    shift "$(( OPTIND - 1 ))"

    outfile=$1

    tmpfile=$(mktemp "$(dirname "$outfile")/tmp-sponge.XXXXXXXX") &&
    cat >"$tmpfile" &&
    if "$append"; then
        cat "$tmpfile" >>"$outfile"
    else
        if [ -f "$outfile" ]; then
            chmod --reference="$outfile" "$tmpfile"
        fi
        if [ -f "$outfile" ]; then
            mv "$tmpfile" "$outfile"
        elif [ -n "$outfile" ] && [ ! -e "$outfile" ]; then
            cat "$tmpfile" >"$outfile"
        else
            cat "$tmpfile"
        fi
    fi &&
    rm -f "$tmpfile"
)

myspongeShell函数将标准输入上可用的所有数据传递到一个临时文件中。

当所有数据都已重定向到临时文件后,收集的数据将被复制到该函数的参数命名的文件中。如果数据不附加到文件中(即-a不使用),并且给定的输出文件名引用了现有的常规文件(如果不存在),则使用mv(如果文件是现有的常规文件,则尝试chmod使用GNU将文件模式传输到临时文件)。如果输出的内容不是常规文件(命名管道,标准输出等),则使用来输出数据cat

如果在命令行上未提供文件,则收集的数据将发送到标准输出。

最后,将删除临时文件。

该功能中的每个步骤都取决于上一步的成功完成。如果一个命令失败(可能包含重要数据),则不会尝试删除该临时文件。

如果命名文件不存在,则将使用用户的默认权限等创建该文件,并将来自标准输入的数据写入其中。

mktemp实用程序不是标准的,但通常可用。

上述功能模拟物的行为中所描述的手册spongemoreutils包在Debian。


tee代替sponge并不是一个可行的选择。您说您已经尝试过了,它似乎很适合您。它可能会工作,可能不会。它取决于何时启动管道中的命令(它们几乎同时启动)的时间以及输入数据文件的大小。

以下是显示使用tee不起作用的情况的示例

原始文件为200000字节,但是在管道之后,它被截断为32 KiB(这很可能对应于我系统上的某些缓冲区大小)。

$ yes | head -n 100000 >hello
$ ls -l hello
-rw-r--r--  1 kk  wheel  200000 Jan 10 09:45 hello
$ cat hello | tee hello >/dev/null
$ ls -l hello
-rw-r--r--  1 kk  wheel  32768 Jan 10 09:46 hello

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

彩色git输出通过管道传输到海绵

来自分类Dev

停止grep解析通过管道传输到文件的自身输出

来自分类Dev

Cakephp中是否有邻居的替代品

来自分类Dev

改造2中的RequestInterceptor是否有替代品?

来自分类Dev

Tensorflow 2.0中是否有cudnnLSTM或cudNNGRU替代品

来自分类Dev

UWP中是否有TemplatePartAttribute的替代品?

来自分类Dev

Angular中是否有ng-repeat的替代品?

来自分类Dev

15.04 中是否有 kdegames 包替代品

来自分类Dev

是否有DynamicResource的替代品

来自分类Dev

是否有ICQ的替代品?

来自分类Dev

是否有DynamicResource的替代品

来自分类Dev

LibreOffice是否有替代品?

来自分类Dev

是否有C ++标准库包装程序或pthread_sigmask的替代品?

来自分类Dev

如何将标准输出通过管道传输到另一个进程,同时在本地文件中捕获标准输出?

来自分类Dev

管道传输到文件时,在 Powershell 中调用的 Python 脚本无法写入标准输出

来自分类Dev

与通过管道传输到文件时相比,ag输出在终端中显得有所不同

来自分类Dev

是否可以将文件列表通过管道传输到Windows上的RMDIR?

来自分类Dev

使用ghostscript合并pdf文件:是否可以将find输出通过管道传输到gs?

来自分类Dev

是否可以通过管道将配置文件传输到hostapd?

来自分类Dev

列出Linux中所有包含* .pdf文件的目录,并将结果通过管道传输到文件

来自分类Dev

如何从NodeJS中的URL获取文件,构建zip文件并通过管道传输到云存储桶

来自分类Dev

Windows Universal App中是否有PhoneTextAccentStyle的替代品(即使仅在Phone中)

来自分类Dev

在PowerShell中将所有写入输出通过管道传输到相同的输出文件

来自分类Dev

将终端的所有输入和输出通过管道传输到文件

来自分类Dev

是否可以通过管道传输到console.log?

来自分类Dev

是否可以将头输出通过管道传输到 sed?

来自分类Dev

.NET Core(或ASP.NET 5)中是否有MEF的替代品

来自分类Dev

是否有NSOpenPanel替代品,或者面板在SwiftUI中的样式可以不同吗?

来自分类Dev

lang 9.0.0中似乎缺少__heap_base,是否有替代品?

Related 相关文章

  1. 1

    彩色git输出通过管道传输到海绵

  2. 2

    停止grep解析通过管道传输到文件的自身输出

  3. 3

    Cakephp中是否有邻居的替代品

  4. 4

    改造2中的RequestInterceptor是否有替代品?

  5. 5

    Tensorflow 2.0中是否有cudnnLSTM或cudNNGRU替代品

  6. 6

    UWP中是否有TemplatePartAttribute的替代品?

  7. 7

    Angular中是否有ng-repeat的替代品?

  8. 8

    15.04 中是否有 kdegames 包替代品

  9. 9

    是否有DynamicResource的替代品

  10. 10

    是否有ICQ的替代品?

  11. 11

    是否有DynamicResource的替代品

  12. 12

    LibreOffice是否有替代品?

  13. 13

    是否有C ++标准库包装程序或pthread_sigmask的替代品?

  14. 14

    如何将标准输出通过管道传输到另一个进程,同时在本地文件中捕获标准输出?

  15. 15

    管道传输到文件时,在 Powershell 中调用的 Python 脚本无法写入标准输出

  16. 16

    与通过管道传输到文件时相比,ag输出在终端中显得有所不同

  17. 17

    是否可以将文件列表通过管道传输到Windows上的RMDIR?

  18. 18

    使用ghostscript合并pdf文件:是否可以将find输出通过管道传输到gs?

  19. 19

    是否可以通过管道将配置文件传输到hostapd?

  20. 20

    列出Linux中所有包含* .pdf文件的目录,并将结果通过管道传输到文件

  21. 21

    如何从NodeJS中的URL获取文件,构建zip文件并通过管道传输到云存储桶

  22. 22

    Windows Universal App中是否有PhoneTextAccentStyle的替代品(即使仅在Phone中)

  23. 23

    在PowerShell中将所有写入输出通过管道传输到相同的输出文件

  24. 24

    将终端的所有输入和输出通过管道传输到文件

  25. 25

    是否可以通过管道传输到console.log?

  26. 26

    是否可以将头输出通过管道传输到 sed?

  27. 27

    .NET Core(或ASP.NET 5)中是否有MEF的替代品

  28. 28

    是否有NSOpenPanel替代品,或者面板在SwiftUI中的样式可以不同吗?

  29. 29

    lang 9.0.0中似乎缺少__heap_base,是否有替代品?

热门标签

归档