如何在脚本中修补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.

我正在尝试编写一个脚本,下载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
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)