쉘스크립트에서 파일실행시에 인자전달이 안됩니다..
안녕하세요.. 제가 안드로이드로 커널을 빌드를 하여 완성하는 과정에서 이걸 쉘 스크립트로 만들고자 하였습니다만 중간에 쉘에서 실행파일을 실행하는 과정에서 인자가 제대로 전달되지않아 이에관하여 조언을 받고자 합니다.. 알려주시면 감사하겠습니다 ㅠㅠ
우선 커널를 언팩할때 실행하면 터미널에 다음과 같이 뜹니다.
---------------
To recompile this image, use:
mkbootimg --kernel zImage --ramdisk initramfs.cpio.gz --base 0x80200000 --cmdline 'vmalloc=600M console=null lpj=67677 user_debug=31 msm_rtb.filter=0x0 ehci-hcd.park=3 coresight-etm.boot_enable=0 androidboot.hardware=geehrc' -o new_boot.img
---------------
그래서 저는 실행하는것을 out.txt로 저장하고(./umkbootimg $boot > out.txt)
이를 이용하여 쉘스크립트를 짰습니다.
#!/bin/bash
boot=$1
echo "Boot=$boot"
dir=${boot%.*}
cp "$dir/ramdisk.cpio.gz" initramfs.cpio.gz
cp "$dir/zImage" zImage
FULL_PATH=$(pwd)'/'
cat out.txt | while read line ;
do
if [ "$line" = "To recompile this image, use:" ];
then
read line
localrun="$FULL_PATH""$line"
echo $localrun
$localrun
fi
done
출력결과는 다음과 같습니다....
neptune@Planitune:~/android-kernel/tool$ ./test boot_ori.img
Boot=boot_ori.img
/home/neptune/android-kernel/tool/mkbootimg --kernel zImage --ramdisk initramfs.cpio.gz --base 0x80200000 --cmdline 'vmalloc=600M console=null lpj=67677 user_debug=31 msm_rtb.filter=0x0 ehci-hcd.park=3 coresight-etm.boot_enable=0 androidboot.hardware=geehrc' -o new_boot.img
usage: mkbootimg
--kernel
--ramdisk
[ --second <2ndbootloader-filename> ]
[ --cmdline ]
[ --board ]
[ --base ]
[ --pagesize ]
[ --ramdiskaddr ]
-o|--output
그런데 저위에 출력된 /home/neptune/android-kernel/tool/mkbootimg --kernel zImage --ramdisk initramfs.cpio.gz --base 0x80200000 --cmdline 'vmalloc=600M console=null lpj=67677 user_debug=31 msm_rtb.filter=0x0 ehci-hcd.park=3 coresight-etm.boot_enable=0 androidboot.hardware=geehrc' -o new_boot.img 이부분을 그대로 복사하여 실행하면 에러없이 잘됩니다..
혹시나 인자로 넘겨지는 파일 경로문제인가 싶어 일부로 틀리게 실행해보았습니다만
error: could not load ramdisk 'initramfs2.cpio.gz'
error: could not load kernel 'zImage2'
와 같은 에러가 뜹니다.. 아예 인자전달이 제대로 행해지고 있는 것 같지가 않아보입니다.. 어떡해하면 좋을까요.. 도움 부탁드립니다ㅠㅠ
똑같은방식으로 임시로 스크립트 작성하여 실행해봤는데
똑같은방식으로 임시로 스크립트 작성하여 실행해봤는데 별 문제가 없는걸 보니 음..
1. out.txt에 저장될때 뭔가 보이지 않는 특수기호가 삽입됐다? -> 복사하지 말고 직접 out.txt를 타자로 작성하여 한번 다시 실험해보세요!
2. cat out.txt | while read line; do ...... done -> while read line; do ......... done < out.txt 로 한번.. (전혀 상관없을것 같긴합니다만)
3. localrun="$FULL_PATH""$line" -> localrun="${FULL_PATH}${line}" 으로 한번
도대체 원인이 뭘까요 ㅠㅠㅠ
neptune@Planitune:~/android-kernel/tool$ ./test boot_ori.img
Boot=boot_ori.img
/home/neptune/android-kernel/tool/mkbootimg --kernel zImage1 --ramdisk initramfs.cpio.gz --base 0x80200000 --cmdline 'vmalloc=600M console=null lpj=67677 user_debug=31 msm_rtb.filter=0x0 ehci-hcd.park=3 coresight-etm.boot_enable=0 androidboot.hardware=geehrc' -o new_boot.img
usage: mkbootimg
--kernel
--ramdisk
[ --second <2ndbootloader-filename> ]
[ --cmdline ]
[ --board ]
[ --base ]
[ --pagesize ]
-o|--output
neptune@Planitune:~/android-kernel/tool$ ./mkbootimg --kernel zImage1 --ramdisk initramfs.cpio.gz --base 0x80200000 --cmdline 'vmalloc=600M console=null lpj=67677 user_debug=31 msm_rtb.filter=0x0 ehci-hcd.park=3 coresight-etm.boot_enable=0 androidboot.hardware=geehrc' -o new_boot.img
error: could not load kernel 'zImage1'
저는 어째서 프로그램의 usage가 뜨는 걸까요... 말씀하신대로 해보았지만 아직도 인자가 재대로 넘어가지 않는 것같습니다..
보통 프로그램의 usage뜨는게 인자 수로 판별하는거니까 인자가 아예 전달되지않았다?... ...인건지...
out.txt///////////
To recompile this image, use:
mkbootimg --kernel zImage1 --ramdisk initramfs.cpio.gz --base 0x80200000 --cmdline 'vmalloc=600M console=null lpj=67677 user_debug=31 msm_rtb.filter=0x0 ehci-hcd.park=3 coresight-etm.boot_enable=0 androidboot.hardware=geehrc' -o new_boot.img
////////////////////
test/////////
#!/bin/bash
boot=$1
echo "Boot=$boot"
dir=${boot%.*}
cp "$dir/ramdisk.cpio.gz" initramfs.cpio.gz
cp "$dir/zImage" zImage
FULL_PATH=$(pwd)'/'
while read line;
do
if [ "$line" = "To recompile this image, use:" ];
then
read line
localrun="${FULL_PATH}${line}"
echo $localrun
$localrun
fi
done < out.txt
//////////////////////////
음.. 스크립트상 문제는 딱히 안보이는거 같은데
음.. 스크립트상 문제는 딱히 안보이는거 같은데 zImage1 파일이 없어서 Usage가 나타나는 것은 아닐까 싶기도 하네요
mkbooting의 Usage 발생 조건에 대해서도 한번 다시 봐보시는게 ..
인자를 줄여보니까 되네요...
To recompile this image, use:
mkbootimg --kernel zImage1 --ramdisk initramfs.cpio.gz -o new_boot.img
로 해보니 작동이 잘 됩니다.
아무래도 --cmdline 'vmalloc=600M console=null lpj=67677 user_debug=31 msm_rtb.filter=0x0 ehci-hcd.park=3 coresight-etm.boot_enable=0 androidboot.hardware=geehrc' 이부분이 문제인것 같아요
특히 '' 이 부분이요.. 텍스트파일에서 ''부분을 긁어오는데 뭔가 문제가 있는것같아요... 저로써는 해결할 방법을 모르겠네요..
음 ..
변수에 들어 있는 작은따옴표(') 가 escaping 되어서, --cmdline 의 인자로 'vmalloc=670M 만 들어가고..
나머지 부분은 mkbootimg 의 인자로 들어갔을 겁니다.
eval $localrun 처럼 앞에 eval 을 주고 실행해 보세요.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
localrun="${FULL_PATH}${line}
localrun="${FULL_PATH}${line}" 직후에
localrun=`echo $localrun | sed s/\'/\"/g` 를 넣으셔서
'를 "로 바꾸고 다시 한번 해보세요..
댓글 달기