mieki256's diary



2017/09/01(金) [n年前の日記]

#2 [raspberrypi][linux] シェルスクリプト内でシンボリックリンクの変更ができなくて悩んだり

昨日、Raspberry Pi3 上で、*.so のシンボリックリンク変更作業をしていた際に、何度も何度も同じ行を打つのが面倒だったのでスクリプトにできないかなーと思いついたわけで。

てなわけで、ググりまくりながら生まれて初めて Linux用のシェルスクリプトを書いてみたのだけど。コレが何故か上手く行かず。

スクリプトは以下。 :

書いてみたスクリプトは以下。数字を入力して、その数字と対応した *.so のシンボリックリンクを /usr/lib/arm-linux-gnueabihf/ 以下に作成する。みたいな。

_chg_libegl.sh
#!/bin/bash
# change link libEGL.so , libEGL.so.1 , libGLESv2.so , libGLESv2.so.2
set -Ceu

if [ "$USER" == "root" ]; then
    :
else
    echo "please sudo chg_libegl.sh."
    exit 0
fi

LIBDIR0=/usr/lib/arm-linux-gnueabihf
LIBEGL0="${LIBDIR0}/libEGL.so.1.0.0"
LIBGLESV20="${LIBDIR0}/libGLESv2.so.2.0.0"

LIBEGL1=/usr/lib/chromium-browser/libEGL.so
LIBGLESV21=/usr/lib/chromium-browser/libGLESv2.so

LIBEGL2=/opt/vc/lib/libbrcmEGL.so
LIBGLESV22=/opt/vc/lib/libbrcmGLESv2.so

LIBEGLSRC=
LIBGLESV2SRC=

echo "change libEGL.so , libGLESv2.so"
echo "  0 : ${LIBEGL0}"
echo "  1 : ${LIBEGL1}"
echo "  2 : ${LIBEGL2}"
read -p "select (0/1/2/n): " num

case "${num}" in
    "0" )
        LIBEGLSRC="${LIBEGL0}"
        LIBGLESV2SRC="${LIBGLESV20}"
        echo "# select 0"
        ;;
    "1" )
        LIBEGLSRC="${LIBEGL1}"
        LIBGLESV2SRC="${LIBGLESV21}"
        echo "# select 1"
        ;;
    "2" )
        LIBEGLSRC="${LIBEGL2}"
        LIBGLESV2SRC="${LIBGLESV22}"
        echo "# select 2"
        ;;
esac

if [ -n "${LIBEGLSRC}" ]; then
    if [ -e "${LIBEGLSRC}" ]; then
        echo "# Found ${LIBEGLSRC}"
        echo "sudo ln -fs ${LIBEGLSRC} ${LIBDIR0}/libEGL.so"
        echo "sudo ln -fs ${LIBEGLSRC} ${LIBDIR0}/libEGL.so.1"
        ln -fs ${LIBEGLSRC} ${LIBDIR0}/libEGL.so
        ln -fs ${LIBEGLSRC} ${LIBDIR0}/libEGL.so.1
    else
        echo "Not found ${LIBEGLSRC}"
    fi
else
    echo "hold libEGL.so link."
fi

if [ -n "${LIBGLESV2SRC}" ]; then
    if [ -e "${LIBGLESV2SRC}" ]; then
        echo "# Found ${LIBGLESV2SRC}"
        echo "sudo ln -fs ${LIBGLESV2SRC} ${LIBDIR0}/libGLESv2.so"
        echo "sudo ln -fs ${LIBGLESV2SRC} ${LIBDIR0}/libGLESv2.so.2"
        ln -fs ${LIBGLESV2SRC} ${LIBDIR0}/libGLESv2.so
        ln -fs ${LIBGLESV2SRC} ${LIBDIR0}/libGLESv2.so.2
    else
        echo "Not found ${LIBGLESV2SRC}"
    fi
else
    echo "hold libGLESv2.so link."
fi

if [ -n "${LIBEGLSRC}" -o -n "${LIBGLESV2SRC}" ]; then
    echo "sudo ldconfig"
    ldconfig
fi

echo -e "\n"
/bin/ls -alF --color=auto ${LIBDIR0}/libEGL*
/bin/ls -alF --color=auto ${LIBDIR0}/libGLESv2*
exit 0

実行結果。 :

実行してみると…。
$ sudo ~/bin/chg_libegl.sh
change libEGL.so , libGLESv2.so
  0 : /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
  1 : /usr/lib/chromium-browser/libEGL.so
  2 : /opt/vc/lib/libbrcmEGL.so
select (0/1/2/n): 0
# select 0
# Found /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
sudo ln -fs /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -fs /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so.1
# Found /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
sudo ln -fs /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so
sudo ln -fs /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
sudo ldconfig


lrwxrwxrwx 1 root root     44  9月  1 18:04 /usr/lib/arm-linux-gnueabihf/libEGL.so -> /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
lrwxrwxrwx 1 root root     44  9月  1 18:04 /usr/lib/arm-linux-gnueabihf/libEGL.so.1 -> /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
-rw-r--r-- 1 root root 175516  8月  4 21:41 /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
lrwxrwxrwx 1 root root    47  9月  1 18:04 /usr/lib/arm-linux-gnueabihf/libGLESv2.so -> /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
lrwxrwxrwx 1 root root    47  9月  1 18:04 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2 -> /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
-rw-r--r-- 1 root root 38184  8月  4 21:41 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
「0」を打ち込んだ時は思った通りに動く。

ところが。
$ sudo ~/bin/chg_libegl.sh
change libEGL.so , libGLESv2.so
  0 : /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
  1 : /usr/lib/chromium-browser/libEGL.so
  2 : /opt/vc/lib/libbrcmEGL.so
select (0/1/2/n): 1
# select 1
# Found /usr/lib/chromium-browser/libEGL.so
sudo ln -fs /usr/lib/chromium-browser/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -fs /usr/lib/chromium-browser/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1
# Found /usr/lib/chromium-browser/libGLESv2.so
sudo ln -fs /usr/lib/chromium-browser/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so
sudo ln -fs /usr/lib/chromium-browser/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
sudo ldconfig


lrwxrwxrwx 1 root root     13  9月  1 18:05 /usr/lib/arm-linux-gnueabihf/libEGL.so -> libbrcmEGL.so
lrwxrwxrwx 1 root root     15  9月  1 18:05 /usr/lib/arm-linux-gnueabihf/libEGL.so.1 -> libEGL.so.1.0.0
-rw-r--r-- 1 root root 175516  8月  4 21:41 /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
lrwxrwxrwx 1 root root    16  9月  1 18:05 /usr/lib/arm-linux-gnueabihf/libGLESv2.so -> libbrcmGLESv2.so
lrwxrwxrwx 1 root root    18  9月  1 18:05 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2 -> libGLESv2.so.2.0.0
-rw-r--r-- 1 root root 38184  8月  4 21:41 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
$ sudo ~/bin/chg_libegl.sh
change libEGL.so , libGLESv2.so
  0 : /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
  1 : /usr/lib/chromium-browser/libEGL.so
  2 : /opt/vc/lib/libbrcmEGL.so
select (0/1/2/n): 2
# select 2
# Found /opt/vc/lib/libbrcmEGL.so
sudo ln -fs /opt/vc/lib/libbrcmEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -fs /opt/vc/lib/libbrcmEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1
# Found /opt/vc/lib/libbrcmGLESv2.so
sudo ln -fs /opt/vc/lib/libbrcmGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so
sudo ln -fs /opt/vc/lib/libbrcmGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
sudo ldconfig


lrwxrwxrwx 1 root root     25  9月  1 18:06 /usr/lib/arm-linux-gnueabihf/libEGL.so -> /opt/vc/lib/libbrcmEGL.so
lrwxrwxrwx 1 root root     15  9月  1 18:06 /usr/lib/arm-linux-gnueabihf/libEGL.so.1 -> libEGL.so.1.0.0
-rw-r--r-- 1 root root 175516  8月  4 21:41 /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
lrwxrwxrwx 1 root root    28  9月  1 18:06 /usr/lib/arm-linux-gnueabihf/libGLESv2.so -> /opt/vc/lib/libbrcmGLESv2.so
lrwxrwxrwx 1 root root    18  9月  1 18:06 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2 -> libGLESv2.so.2.0.0
-rw-r--r-- 1 root root 38184  8月  4 21:41 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
「1」や「2」を打った時は変な .so にリンクされたり、*.so.1 や *.so.2 のリンクが変わらなかったりする。

よくわからないのが、bash を開いて一行一行打ち込むと、ちゃんと反映されること。
$ sudo ln -fs /usr/lib/chromium-browser/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1
$ sudo ln -fs /usr/lib/chromium-browser/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so
$ sudo ln -fs /usr/lib/chromium-browser/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
$ sudo ln -fs /usr/lib/chromium-browser/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so

$ ll /usr/lib/arm-linux-gnueabihf/libEGL*
lrwxrwxrwx 1 root root     35  9月  1 18:08 /usr/lib/arm-linux-gnueabihf/libEGL.so -> /usr/lib/chromium-browser/libEGL.so*
lrwxrwxrwx 1 root root     35  9月  1 18:08 /usr/lib/arm-linux-gnueabihf/libEGL.so.1 -> /usr/lib/chromium-browser/libEGL.so*
-rw-r--r-- 1 root root 175516  8月  4 21:41 /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0

$ ll /usr/lib/arm-linux-gnueabihf/libGLESv2*
lrwxrwxrwx 1 root root    38  9月  1 18:08 /usr/lib/arm-linux-gnueabihf/libGLESv2.so -> /usr/lib/chromium-browser/libGLESv2.so*
lrwxrwxrwx 1 root root    38  9月  1 18:08 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2 -> /usr/lib/chromium-browser/libGLESv2.so*
-rw-r--r-- 1 root root 38184  8月  4 21:41 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0

一体何を間違えているのだろう…。シェルスクリプト、あるいは ln に、何か罠でもあるのか。それともケアレスミスなのか…。
  • ln -fs SRC DST でシンボリックリンクを上書き変更する際に時間がかかっているのだろうか。と思って sleep 1 をあちこちに入れてみたけど変化なし。
  • ln -fs "SRC" "DST" とダブルクオーテーションで囲んでみたけど変化なし。
  • set -Ceux を指定して、動作を一行ずつ表示させてみたけど、おかしな指定をしてるようには見えず。

まあ、sudo rpi-update をしたらこんなことをしなくても済むように修正されたので、このスクリプトは既に不要ではあるのだけど。しかし、どうしてこんな妙な動作になるのか…。

ldconfigが関係してるのかな。 :

以下のような書き方をしたら思った通りに動いてくれた。

_chg_libegl.sh.new
#!/bin/sh
# change link libEGL.so , libEGL.so.1 , libGLESv2.so , libGLESv2.so.2
set -Ceu

echo "change libEGL.so , libGLESv2.so"
echo "  0 : /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0"
echo "  1 : /usr/lib/chromium-browser/libEGL.so"
echo "  2 : /opt/vc/lib/libbrcmEGL.so"
read -p "select (0/1/2/n): " num

case "${num}" in
    "0" )
        ln -fs /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so
        ln -fs /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so.1
        ln -fs /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so
        ln -fs /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
        ls -alF --color=auto /usr/lib/arm-linux-gnueabihf/libEGL*
        ls -alF --color=auto /usr/lib/arm-linux-gnueabihf/libGLESv2*
        echo "\nplease sudo ldconfig"
        ;;
    "1" )
        ln -fs /usr/lib/chromium-browser/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so
        ln -fs /usr/lib/chromium-browser/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1
        ln -fs /usr/lib/chromium-browser/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so
        ln -fs /usr/lib/chromium-browser/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
        ls -alF --color=auto /usr/lib/arm-linux-gnueabihf/libEGL*
        ls -alF --color=auto /usr/lib/arm-linux-gnueabihf/libGLESv2*
        echo "\nplease sudo ldconfig"
        ;;
    "2" )
        ln -fs /opt/vc/lib/libbrcmEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so
        ln -fs /opt/vc/lib/libbrcmEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1
        ln -fs /opt/vc/lib/libbrcmGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so
        ln -fs /opt/vc/lib/libbrcmGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
        ls -alF --color=auto /usr/lib/arm-linux-gnueabihf/libEGL*
        ls -alF --color=auto /usr/lib/arm-linux-gnueabihf/libGLESv2*
        echo "\nplease sudo ldconfig"
        ;;
    * )
        ls -alF --color=auto /usr/lib/arm-linux-gnueabihf/libEGL*
        ls -alF --color=auto /usr/lib/arm-linux-gnueabihf/libGLESv2*
        ;;
esac
exit 0

ldconfig を呼ぶと以前のような妙な動作になるけど、ldconfig を呼ばなければ思った通りに動くことに気が付いた。…なんで? どうして?

以上です。

過去ログ表示

Prev - 2017/09 - Next
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project