首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在脚本中修补bash源文件

如何在脚本中修补bash源文件
EN

Stack Overflow用户
提问于 2017-03-20 00:34:06
回答 2查看 275关注 0票数 0

我正在尝试编写一个脚本,该脚本正在下载Bash和最新的安全补丁:

代码语言:javascript
复制
cd ~/sources

mkdir bash && cd $_
wget https://ftp.gnu.org/gnu/bash/bash-4.4.tar.gz

wget -r -np -nd --reject="index.html*,.sig" https://ftp.gnu.org/gnu/bash/bash-4.4-patches/
nfiles=$(ls | wc -l)
tar zxf bash-4.4.tar.gz && cd bash-4.4

echo "Patching sourcefiles..."
for i in ../bash44-[0-9][0-9][0-9]; do patch -p0 -s < $nfiles; done

echo "Compiling GNU bash..."
./configure --prefix=/usr/local
make
make install
cp -f /usr/local/bin/bash /bin/bash

我使用wget获取所有补丁文件(共12个),并使用nfiles=$(ls | wc -l)将其保存到该变量中。这是第一个问题。nfiles的内容是13,因为bash-4.4.tar.gz也在计算,但我只有12个补丁文件。

现在我试着在这里打补丁:

for i in ../bash44-[0-9][0-9][0-9]; do patch -p0 -s < $nfiles; done

但是这不起作用,他不能从bash44-001修补到bash44-012...

nfiles变量包含12(13)作为数字,但我需要另一种格式才能使它像012一样工作。

我希望你们能理解我的问题。

EN

回答 2

Stack Overflow用户

发布于 2017-03-20 00:54:43

我不确定我是否完全理解你的问题,但我会尽力帮助你。

问题1: $(ls | wc -l)返回的行数多于所需的行数。

如果我想确保只计算正确的文件,我总是使用find --下面这样的代码可能适合您:

代码语言:javascript
复制
$(find . -name "bash44-[0-9][0-9][0-9]" | wc -l)

问题2:通配符[0-9][0-9][0-9]不能保持数字顺序。

我觉得奇怪的是,在for循环中没有任何地方使用变量i

尝试如下所示:

代码语言:javascript
复制
for i in `eval echo "{000..0$nfiles}"`; do echo "bash44-$i"; done

常规问题:

如果您正在尝试使用格式为"bash44-[0-9][0-9][0-9]“的目录列表执行某些操作,并且希望以升序执行此操作,我将简单地执行以下操作:

代码语言:javascript
复制
for dir in `find . -type d -name "bash44-[0-9][0-9][0-9]" | sort`; do
  something_with "$dir"
done
票数 0
EN

Stack Overflow用户

发布于 2017-03-20 00:57:26

您可以更改:

代码语言:javascript
复制
nfiles=$(ls | wc -l)

代码语言:javascript
复制
nfiles=$(wc -l < <(printf '%s\n' bash44-[0-9][0-9][0-9]))

这将把bash-4.4.tar.gz排除在统计范围之外。

更好的是,您可以将正则表达式存储在一个变量中,并在两个位置使用它:

代码语言:javascript
复制
file_regex='bash44-[0-9][0-9][0-9]'
nfiles=$(wc -l < <(printf '%s\n' $file_regex))

以及以后的

代码语言:javascript
复制
for i in $file_regex; do patch ...

我不确定< $nfiles是否会将nfiles变量的内容视为文件,但这里的情况并非如此。你是想说patch -p0 -s $nfiles吗?如果您确实希望patch命令从标准输入中读取数字,那么您需要这样:

代码语言:javascript
复制
patch -p0 -s <(echo $nfiles)

另请参阅:

  • Why you shouldn't parse the output of ls
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42889123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档