Bash backtick转义

Bash backtick转义,bash,Bash,这是Bash变量声明语句: foo='b'` `'ar' 效率低于此: foo='bar' 这种格式化“挂起”或“对齐”缩进(行连续体)的方式: 产生子外壳、浪费资源或以任何方式影响性能,除了 讨厌那些不喜欢它的形式(反?)可读性的人 效率如:计算机效率,而不是“人类输入许多字符并创造基于空间的免费维护债务” 能否轻松证明对性能的影响(或缺乏影响) tester1() { for i in {1..1000}; do a_long_variable_name='a seem

这是Bash变量声明语句:

foo='b'`    `'ar'
效率低于此:

foo='bar'
这种格式化“挂起”或“对齐”缩进(行连续体)的方式:

产生子外壳、浪费资源或以任何方式影响性能,除了 讨厌那些不喜欢它的形式(反?)可读性的人

效率如:计算机效率,而不是“人类输入许多字符并创造基于空间的免费维护债务”

能否轻松证明对性能的影响(或缺乏影响)

tester1() {
  for i in {1..1000}; do
    a_long_variable_name='a seemingly infinitely long '`
                        `'string requiring continuation'`
                        `'on the next line...'
    echo $a_long_variable_name > tmp 
  done
}

tester2() {
  for i in {1..1000}; do
    a_long_variable_name="a seemingly infinitely long\
string requiring continuation\
on the next line..."
    echo $a_long_variable_name > tmp 
  done
}

echo tester1
time tester1
echo tester2
time tester2
结果

tester1

real    0m1.878s
user    0m0.209s
sys     0m0.566s

tester2

real    0m0.335s
user    0m0.026s
sys     0m0.078s
这些都具有与案例2类似的时间安排:

read -r -d '' a_long_variable_name <<EOF
    a seemingly infinitely long
    string requiring continuation
    on the next line...
EOF

a_long_variable_name="a seemingly infinitely long\
                      string requiring continuation\
                      on the next line..."

read-r-d''a_long_variable_name如果我需要它,我可能会这样构建字符串:

x='a seemingly infinitely long '
x="$x"'string requiring continuatio'
x="$x"'n on the next line...'

a_long_variable_name="$x"
或者是关于这个主题的小变化。或者我会在每一行重复长变量名。下面是我使用的真实脚本-它为我列出了相关的环境变量:

informix1="DB[^=]|DELIMIDENT=|SQL|ONCONFIG|TBCONFIG|INFOR"
informix2="CLIENT_LOCALE=|GL_|GLS8BITSYS|CC8BITLEVEL|ESQL|FET_BUF_SIZE="
informix3="INF_ROLE_SEP=|NODEFDAC=|ONCONFIG|OPTCOMPIND|PDQ|PSORT"
informix4="PLCONFIG|SERVER_LOCALE|FGL|C4GL|NE_"
informix5="TCL_LIBRARY|TK_LIBRARY|TERM=|TERMCAP=|TERMINFO="
informix="$informix1|$informix2|$informix3|$informix4|$informix5"
system1="COLLCHAR=|LANG=|LC_"
system2="(DY)?LD_LIBRARY_PATH(_[63][42])?=|PATH=|SHLIB_PATH=|LIBPATH="
system="$system1|$system2"
jlss="IX([A-Z]|D(32|64)?)="

env |
${EGREP:-egrep} "^($informix|$system|$jlss)" |
sort

(当Mac OS X 10.7.X
egrep
因为表达式“太大”而停止处理表达式时,切换要使用哪个
egrep
程序的功能变得非常必要。)

我忍不住想,如果你关心性能和使用bash脚本,你做错了什么。Ï想反对或支持一个编码约定,如果它导致了可以证明的无用的低效率,那么就没有理由这样做。你真的知道,如果倒勾“成本”周期?这是一个简单、直截了当的问题,我无法用一种或另一种方式来说明。.根据,回溯是在子shell中计算的,这几乎肯定会花费你(在计算周期方面)。某种类型的解析器可以查看回溯,意识到没有代币,可能会把整个事情搞得一团糟,不是吗?我认为有理由怀疑……另请参见。完美答案!:)所以,我想背虱逃逸的代价确实很高。。(一个聪明的前瞻性标记器可能会抵消这一点,我错了吗?)?使用纯反斜杠,如tester2?(缩进会很好…)可能是bash以某种方式优化了它。相同的意思是什么?A)如果Bash在遇到backtick时生成了子shell(它就是这样做的,对吗?),那么无论发生什么,它都意味着浪费了周期;如果它查看背景标记内部并意识到没有标记,那么它可以将整个标记作为一个no-op“吞下并丢弃”。2)使用相同的
,我的意思是:行延续后类似Python的列对齐缩进。这是一场关于长字符串的代码格式约定的辩论。。如果是那样的话,你会怎么做?更新了答案,我自己主要用的是埃雷多克。我同意,回拍开销没有意义,应该优化掉。@Robottinosino,这是一个很好的问题。我认为你的回击是一个很好的解决方案。我将对此进行调查,如果我能找到更好的方法,我将进行更新。我尝试了各种方法(sed、echo、herdeocs),但找不到处理单词拆分的快速方法。亲爱的乔纳森,我个人觉得在Bash中,读取单引号中的常量值更容易。双引号已经告诉我“注意这里的扩张”。当我看到一句话时,我的“大脑解析器”可以放松下来。当然,其他人会不同意。。实际上更喜欢始终使用双引号的一致性。。
informix1="DB[^=]|DELIMIDENT=|SQL|ONCONFIG|TBCONFIG|INFOR"
informix2="CLIENT_LOCALE=|GL_|GLS8BITSYS|CC8BITLEVEL|ESQL|FET_BUF_SIZE="
informix3="INF_ROLE_SEP=|NODEFDAC=|ONCONFIG|OPTCOMPIND|PDQ|PSORT"
informix4="PLCONFIG|SERVER_LOCALE|FGL|C4GL|NE_"
informix5="TCL_LIBRARY|TK_LIBRARY|TERM=|TERMCAP=|TERMINFO="
informix="$informix1|$informix2|$informix3|$informix4|$informix5"
system1="COLLCHAR=|LANG=|LC_"
system2="(DY)?LD_LIBRARY_PATH(_[63][42])?=|PATH=|SHLIB_PATH=|LIBPATH="
system="$system1|$system2"
jlss="IX([A-Z]|D(32|64)?)="

env |
${EGREP:-egrep} "^($informix|$system|$jlss)" |
sort