使用 xargs 扩展 shell 表达式时的操作顺序
Order of operations when expanding shell expressions with xargs
我正在尝试使用这个相当长的表达式替换二进制文件中的一些字节
objdump --show-raw-insn -d libc-2.30.so | grep -w movdqa | awk '{print substr(, 1, length()-1)}' | xargs -I {} sh -c "printf '\xf3' | dd of=$mybinary bs=1 seek=$((0x{})) count=1 conv=notrunc;"
在此表达式中,$((0x{}))
在 xargs 将 {}
替换为要覆盖的字节的十六进制值之前由 shell 求值。 $((0x{}))
用十进制值替换十六进制值,例如0xF 到 16.
-bash: 0x{}: syntax error: invalid arithmetic operator (error token is "{}")
如何在 bash 尝试扩展 $((0x{}))
之前让 xargs 到 运行 它的替换?
将表达式的 xargs 部分放在单引号而不是双引号中解决了这个问题。 shell 不会扩展单引号中的表达式,因此在扩展表达式之前必须等待 xargs 调用。 Printf 还需要交换引号以反映此更改。
objdump --show-raw-insn -d libc-2.30.so | grep -w movdqa | awk '{print substr(, 1, length()-1)}' | xargs -I {} sh -c 'printf "\xf3" | dd of=libc-2.30.so bs=1 seek=$((0x{})) count=1 conv=notrunc;'
我正在尝试使用这个相当长的表达式替换二进制文件中的一些字节
objdump --show-raw-insn -d libc-2.30.so | grep -w movdqa | awk '{print substr(, 1, length()-1)}' | xargs -I {} sh -c "printf '\xf3' | dd of=$mybinary bs=1 seek=$((0x{})) count=1 conv=notrunc;"
在此表达式中,$((0x{}))
在 xargs 将 {}
替换为要覆盖的字节的十六进制值之前由 shell 求值。 $((0x{}))
用十进制值替换十六进制值,例如0xF 到 16.
-bash: 0x{}: syntax error: invalid arithmetic operator (error token is "{}")
如何在 bash 尝试扩展 $((0x{}))
之前让 xargs 到 运行 它的替换?
将表达式的 xargs 部分放在单引号而不是双引号中解决了这个问题。 shell 不会扩展单引号中的表达式,因此在扩展表达式之前必须等待 xargs 调用。 Printf 还需要交换引号以反映此更改。
objdump --show-raw-insn -d libc-2.30.so | grep -w movdqa | awk '{print substr(, 1, length()-1)}' | xargs -I {} sh -c 'printf "\xf3" | dd of=libc-2.30.so bs=1 seek=$((0x{})) count=1 conv=notrunc;'