将值传递给脚本中的参数

将值传递给脚本中的参数

以下是复制某个命令的所有库以创建 chroot 环境的脚本。

例如:

./cplb.sh /bin/ls将复制命令的所有库ls(即ldd /bin/ls命令列出的文件)。

cplb.sh

CHROOT='/var/chroot'
mkdir $CHROOT

for i in $( ldd $* |cut -d " " -f3 |sort |uniq)
do
cp --parents $i $CHROOT
done

echo "Chroot jail is ready. To access it execute: chroot $CHROOT"

现在,当我跑步时,./cplb.sh /bin/ls它就像一个魅力。但是当我同时运行多个命令时,例如:

./cplb.sh /bin/{ls,cat}

它抛出一个错误说:

cannot stat : '/bin/ls:' file or dir not found
cannot stat : '/bin/cat:' file or dir not found

我可以在命令后面看到一个冒号,即,/bin/ls:该冒号导致错误。现在,它从哪里来以及如何解决这个问题,以便我可以同时运行多个命令的脚本?

答案1

的输出ldd /bin/ls可能如下所示:

linux-vdso.so.1 (0x00007fff2cffe000)
libcap.so.2 => /usr/lib/libcap.so.2 (0x00007f87e978f000)
libacl.so.1 => /usr/lib/libacl.so.1 (0x00007f87e9586000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f87e91d9000)
libattr.so.1 => /usr/lib/libattr.so.1 (0x00007f87e8fd4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f87e9993000)

的输出ldd /bin/ls /bin/cat可能如下所示:

/bin/ls:
    linux-vdso.so.1 (0x00007fffd25df000)
    libcap.so.2 => /usr/lib/libcap.so.2 (0x00007f28f8d09000)
    libacl.so.1 => /usr/lib/libacl.so.1 (0x00007f28f8b00000)
    libc.so.6 => /usr/lib/libc.so.6 (0x00007f28f8753000)
    libattr.so.1 => /usr/lib/libattr.so.1 (0x00007f28f854e000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f28f8f0d000)
/bin/cat:
    linux-vdso.so.1 (0x00007ffff9dfe000)
    libc.so.6 => /usr/lib/libc.so.6 (0x00007fc44208a000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fc442437000)

试试这个:

ldd "$@" | cut -d' ' -f3 | sort -u | grep -v ':$' |
while read i
do
    cp --parents "$i" "$CHROOT"
done

上面,我们用来grep删除/bin/ls:/bin/cat:线。是:$ 匹配行尾冒号的正则表达式。

请注意,我对您的脚本做了一些其他更改。管道到循环的风格更为惯用。sort通常有一个-u删除重复项的选项。通常最好使用"$@"代替,$*因为它将正确扩展为带有空格和特殊字符的文件名。不过在这种情况下这应该不重要。


要复制命令及其库,请在cp循环下方添加第二个调用。

ldd "$@" | cut -d' ' -f3 | sort -u | grep -v ':$' |
while read i
do
    cp --parents "$i" "$CHROOT"
done
cp --parents "$@" "$CHROOT"

相关内容