在执行之前取消展开脚本以处理此处的文档

在执行之前取消展开脚本以处理此处的文档

让我们考虑下面的代码

#!/bin/bash

var=$(
        cat <<-EOF
                Foo Bar
        EOF
)

echo "${var}"

这与选项卡的预期一样工作,即var变量保持分配Foo Bar

但是,考虑一种情况,我在终端上删除此文件,并将此脚本的内容复制粘贴到另一个文件,而不是使用cpscp

现在,该脚本将包含空格而不是制表符,因此上面的相同脚本会给出空格而不是制表符的错误

所以,我想在unexpand继续执行程序之前修改脚本

我尝试像这样修改上面的代码

#!/bin/bash

unexpand --first-only $0 | sponge $0

var=$(
        cat <<-EOF
                Foo Bar
        EOF
)

echo "${var}"

这第二次有效,我知道为什么会发生这种情况

但我想让这个程序第一次正确运行,如何修改我的脚本,以便它第一次使用空格而不是制表符正确运行

注意:我知道这可以通过将文件拆分为两个单独的脚本来完成,但我不想这样做。我只想只有一个脚本。

答案1

尝试修改正在运行的脚本的源代码似乎是通往鼻恶魔的道路。

怎么样(未经测试):

#!/usr/bin/env bash

: ${TMPDIR='/usr/tmp'}
tmpfile=$(mktemp)
tooldir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
if [[ "$tooldir" != "$TMPDIR" ]]; then
    # copying first to get the same permissions on the tmp as on the original
    cp "$0" "$tmpfile" &&
    unexpand --first-only "$0" > "$tmpfile" &&
    "$tmpfile" "$@"
fi

var=$(
        cat <<-EOF
                Foo Bar
        EOF
)

echo "${var}"

相关内容