如何在脚本中修补bash源文件
我正在尝试编写一个脚本,下载Bash和最新的安全补丁:如何在脚本中修补bash源文件,bash,shell,for-loop,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.
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
cd~/来源
mkdir bash&cd$_
wgethttps://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/
n文件=$(ls | wc-l)
tar zxf bash-4.4.tar.gz和cd bash-4.4
echo“修补源文件…”
对于../bash44-[0-9][0-9][0-9]中的i;do patch-p0-s<$n文件;完成
echo“编译GNUBash…”
./configure--prefix=/usr/local
制作
安装
cp-f/usr/local/bin/bash/bin/bash
我正在使用wget获取所有补丁文件(其中12个),并使用nfiles=$(ls | wc-l)
将其保存到该变量中。
这是第一个问题。。。nfiles的内容是13,因为bash-4.4.tar.gz也在计算中,但我只有12个补丁文件
现在,我正试图在这里修补它:
用于../bash44-[0-9][0-9][0-9]中的i;do patch-p0-s<$n文件;完成
但这不起作用,他没有从bash44-001打补丁到bash44-012…nfiles变量包含12(13)作为数字,但我需要另一种格式使其像012一样工作。
我希望你们能理解我的问题。我不确定我是否完全理解你们的问题,但无论如何我都会尽力帮助你们 问题1:
$(ls | wc-l)
返回的行数超过要求
如果我想确保只计算正确的文件,我总是使用find
——类似的方法可能适合您:
$(find . -name "bash44-[0-9][0-9][0-9]" | wc -l)
问题2:通配符[0-9][0-9][0-9]
不保持数字顺序
我觉得奇怪的是,变量I
在for
循环中没有使用
尝试以下方法:
for i in `eval echo "{000..0$nfiles}"`; do echo "bash44-$i"; done
一般问题:
如果您试图使用格式为“bash44-[0-9][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
您可以更改:
nfiles=$(ls | wc -l)
到
后来
for i in $file_regex; do patch ...
我不确定<$nfiles
——这会将nfiles
变量的内容视为一个文件,这里不是这样。你的意思是说补丁-p0-s$N文件
?如果您确实希望patch
命令从stdin读取数字,则需要:
patch -p0 -s <(echo $nfiles)
patch-p0-s我试图更好地解释我的问题:我正在下载bash-4.4.tar.gz和它们命名的补丁(bash44-001,bash44-002[…]bash44-012),而不是试图用下载的安全补丁(bash44-001[…]等)修补sourc文件。对于那个循环,我试图使用nfiles=$(ls | wc-l)行。->运行修补循环,直到每个符合条件的bash44-?
文件达到文件夹中已循环一次的文件量(最后一个bash44-0xx修补文件)。我不知道你为什么需要nfiles
。我试图更好地解释我的问题:我下载的是bash-4.4.tar.gz和它们命名的补丁(bash44-001,bash44-002[…]bash44-012),而不是我试图用下载的安全补丁(bash44-001[…]等)来修补sourcfiles。对于那个循环,我试图使用nfiles=$(ls | wc-l)行。->运行修补循环,直到达到文件夹中的文件量(最后一个bash44-0xx修补文件)
for i in $file_regex; do patch ...
patch -p0 -s <(echo $nfiles)