スクリプトのパラメータに値を渡す

スクリプトのパラメータに値を渡す

以下は、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ループの下に2番目の呼び出しを追加します。

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

おすすめ記事