让我们考虑下面的代码
#!/bin/bash
var=$(
cat <<-EOF
Foo Bar
EOF
)
echo "${var}"
这与选项卡的预期一样工作,即var
变量保持分配Foo Bar
但是,考虑一种情况,我在终端上删除此文件,并将此脚本的内容复制粘贴到另一个文件,而不是使用cp
或scp
现在,该脚本将包含空格而不是制表符,因此上面的相同脚本会给出空格而不是制表符的错误
所以,我想在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}"