2017/09/01(金) [n年前の日記]
#2 [raspberrypi][linux] シェルスクリプト内でシンボリックリンクの変更ができなくて悩んだり
昨日、Raspberry Pi3 上で、*.so のシンボリックリンク変更作業をしていた際に、何度も何度も同じ行を打つのが面倒だったのでスクリプトにできないかなーと思いついたわけで。
てなわけで、ググりまくりながら生まれて初めて Linux用のシェルスクリプトを書いてみたのだけど。コレが何故か上手く行かず。
てなわけで、ググりまくりながら生まれて初めて Linux用のシェルスクリプトを書いてみたのだけど。コレが何故か上手く行かず。
◎ スクリプトは以下。 :
書いてみたスクリプトは以下。数字を入力して、その数字と対応した *.so のシンボリックリンクを /usr/lib/arm-linux-gnueabihf/ 以下に作成する。みたいな。
_chg_libegl.sh
_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
◎ 実行結果。 :
実行してみると…。
ところが。
よくわからないのが、bash を開いて一行一行打ち込むと、ちゃんと反映されること。
一体何を間違えているのだろう…。シェルスクリプト、あるいは ln に、何か罠でもあるのか。それともケアレスミスなのか…。
まあ、sudo rpi-update をしたらこんなことをしなくても済むように修正されたので、このスクリプトは既に不要ではあるのだけど。しかし、どうしてこんな妙な動作になるのか…。
$ 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
ldconfig を呼ぶと以前のような妙な動作になるけど、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 を呼ばなければ思った通りに動くことに気が付いた。…なんで? どうして?
[ ツッコむ ]
以上です。