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

时间:2017-03-19 16:34:06

标签: bash shell for-loop

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

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一样工作。

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

2 个答案:

答案 0 :(得分:0)

我不确定我是否理解你的问题,但无论如何我都会尽力帮助。

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

如果我想确保只计算正确的文件,我总是使用find - 这样的事情可能对您有用:

$(find . -name "bash44-[0-9][0-9][0-9]" | wc -l)

问题2:通配符[0-9][0-9][0-9]未保留数字顺序。

我发现奇怪的是变量ifor循环中没有使用。

尝试类似:

for i in `eval echo "{000..0$nfiles}"`; do echo "bash44-$i"; done

一般问题:

如果您尝试使用格式为“bash44-[0-9][0-9][0-9]”的目录列表执行某些操作,并且您希望按升序执行此操作,我只会这样做:

for dir in `find . -type d -name "bash44-[0-9][0-9][0-9]" | sort`; do
  something_with "$dir"
done

答案 1 :(得分:0)

您可以更改:

nfiles=$(ls | wc -l)

nfiles=$(wc -l < <(printf '%s\n' bash44-[0-9][0-9][0-9]))

这会排除bash-4.4.tar.gz被计算在内。

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

file_regex='bash44-[0-9][0-9][0-9]'
nfiles=$(wc -l < <(printf '%s\n' $file_regex))

以后

for i in $file_regex; do patch ...

我不确定< $nfiles - 会将nfiles变量的内容视为文件,但这并非如此。你的意思是说patch -p0 -s $nfiles吗?如果你真的希望patch命令从stdin读取数字,那么你需要这个:

patch -p0 -s <(echo $nfiles)

另见: