gpt4 book ai didi

c - Bash 将脚本参数插入字符串

转载 作者:行者123 更新时间:2023-11-30 18:36:12 26 4
gpt4 key购买 nike

由于一个问题,我很累:我想运行一个 bash 脚本,它会自动创建另一个 bash 脚本,而该脚本又应该包含 C 代码,该代码会在其输出通过管道传输到 aplay 时即时编译和运行。我的示例基于 ComputerPhile bitshift variations code .

我有一个像这样的 C 脚本(稍后应该被替换和开发):

g(i, x, t, o) {
return ((3 & x & (i * (
(3 & i >> 16 ? "BY}6YB6%" : "Qj}6jQ6%")[t%8] + 51
) >> o)) << 4);
};

main(i, n, s) {
for (i = 0; ;i++)
putchar(
g(i, 1, n = i >> 14, 12) +
g(i, s = i >> 17, n^i >> 13, 10) +
g(i, s/3, n + ((i >> 11) % 3), 10) +
g(i, s/5, 8 + n - ((i >> 10) % 3), 9)
);
}

我想要 1. 缩小它并 2. 将 " 字符转义为 \"获取像这样的 bash 脚本:

#!/bin/bash
echo "g(i,x,t,o){return((3&x&(i*((3&i>>16?\"BY}6YB6%\":\"Qj}6jQ6%\")[t%8]+51)>>o))<<4);};main(i,n,s){for(i=0;;i++)putchar(g(i,1,n=i>>14,12)+g(i,s=i>>17,n^i>>13,10)+g(i,s/3,n+((i>>11)%3),10)+g(i,s/5,8+n-((i>>10)%3),9));}"|gcc -xc -&&./a.out|aplay

但是,我似乎无法接近这个目标。它要么确实生成一个空字符串 (echo ""|gcc ...),要么奇怪地将脚本参数粘贴到 (...return ((3 & x & (i c2sh. sh tmpwaveform.cwaveform.sh ( (3 & i >> 16 ? BY}6YB6%...,但我已经有一个版本,其中 " 被正确替换)。

我的代码(没有清理,所以你可以看到我尝试过的其他两件事)当前是:

#!/bin/bash

echo '#!/bin/bash' > tmp

out=''

echo $(cat waveform.c | tr '"' ' ')

#while read line; do
# out+="$line"
#done < 'waveform.c'

#out=$(echo $out | sed 's/"/\\"/g')
out=${out/"/\\"}

echo 'echo "'$out'" | gcc -xc -&& ./a.out | aplay' >> tmp

mv tmp 'waveform.sh'
chmod +x 'waveform.sh'

这到底是怎么回事?应该如何正确完成?

最佳答案

正确吗?这是不应该这样做的。在 bash 中,代码生成是一种“味道”,与公认的最佳实践相反。

但是,如果您无论如何都要这样做,请让 shell 进行转义,而不是尝试编写自己的逻辑(这几乎毫无异常(exception)地容易出现 shell 注入(inject)漏洞):

#!/bin/bash
infile=${1:-waveform.c} # read name from command-line argument if given
content=$(<"$infile") # $(<foo) is more efficient than $(cat foo)
content=${content//[[:space:]]/} # trim spaces from variable contents

# put the arguments to the command you want to generate into an array
cmd=( printf '%s\n' "$content" )

# tell the shell to generate a string which has each element of that array escaped
printf -v cmd_q '%q ' "${cmd[@]}"

# put our generated contents into an array, one line per each;
# not essential, but makes it easy to comment each line we generate below.
output=(
'#!/bin/bash' # using bash ensures that printf %q-generated code works.
"$cmd_q | gcc -xc - || exit" # use our generated string for all non-constant code.
'./a.out | aplay'
)
printf '%s\n' "${output[@]}" # finally, emit output with all of the above
<小时/>

注意事项:

  • printf '%q' 以这样的方式格式化给定的 shell 变量,当由 shell 计算时,它将计算回其原始文字内容。这不仅对于正确性很重要,而且对于安全性也很重要:如果您正在监听其他人代码中的波形,您不会希望对 /* $(rm -rf ~) */ 进行求值通过你的 shell 。
  • echo 是一个非常模糊指定的命令,以便允许各种历史操作系统的截然不同的实现都遵守 the spec 。正如 POSIX 建议的那样,在数据不是手动生成且已知不会触发任何歧义的任何情况下,都应使用 printf

关于c - Bash 将脚本参数插入字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42660527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com