LINUX.ORG.RU

bash vs sh: моя запутаться

 ,


0

1

есть некий код
пробуем запускать

sh use deadbeef ololo
old: media-sound/deadbeef ape converter dts hotkeys psf src supereq alac curl shellexec cover cover-imlib2 mms lastfm wma zip pltbrowser m3u
new: /deadbeef ololo 
аха - тыква
запускаем иначе
./use deadbeef ololo
old: media-sound/deadbeef ape converter dts hotkeys psf src supereq alac curl shellexec cover cover-imlib2 mms lastfm wma zip pltbrowser m3u
new: media-sound/deadbeef ape converter dts hotkeys psf src supereq alac curl shellexec cover cover-imlib2 mms lastfm wma zip pltbrowser m3u ololo
ладушки
но!
ls -lh /bin/sh 
lrwxrwxrwx 1 root 0 4 янв 24 06:00 /bin/sh -> bash
и
sh --version
GNU bash, version 4.2.45(1)-release (i686-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
спотыкается на вот этом коде
find_category(){
	source "/etc/make.conf" 2>/dev/null
	source "${PORT_ETC}/make.conf" 2>/dev/null
	[[ -z "${PORTDIR}" ]] && PORTDIR="/usr/portage"
	if [[ -n "$(eix -V 2>/dev/null)" ]];then
		PORTDIR_OVERLAY="$(eix --print PORTDIR_OVERLAY)"
	else
		export "$(grep "^PORTDIR_OVERLAY=" <<< "$(emerge --info 2>/dev/null)" | tr -d \")"
	fi
	for target in ${PORTDIR} ${PORTDIR_OVERLAY};do
		categories+="$(ls -d1 ${target}/{*-*,virtual} 2>/dev/null)"$'\n'
	done
	categories="$(sed '/^$/d' <<< "${categories}" 2>/dev/null)"
	while read line;do
		if [[ -d "${line}/${atom}" ]];then
			category+="${line##*/}"$'\n'
		fi
	done <<< "${categories}"
	echo "${category}"
}
скрин
какого!?

★★★★

Последнее исправление: megabaks (всего исправлений: 1)
Ответ на: комментарий от derlafff

Т.е. если вот так сделать, то все работает:

        if [ -f "/etc/make.conf" ]; then
                source "/etc/make.conf"
        elif [ -f "${PORT_ETC}/make.conf" ]; then
                source "${PORT_ETC}/make.conf"
        fi
derlafff ★★★★★
()
Ответ на: комментарий от derlafff

бинго!
сраный sh спотыкается именно на этом.
а bash молодец.
оставлю на всякий случай костыль.
решено.

megabaks ★★★★
() автор топика
Ответ на: комментарий от megabaks

почему-бы тебе явно не написать #!/bin/bash в самом начале? Причём это /bin/bash должно указывать именно на bash. Вот так:

$ file /bin/bash
/bin/bash: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), stripped
(естественно в твоём дистре путь может быть другим)

Тогда неоднозначностей не будет, и ОС будет точно знать, чем ей пользоваться. Можно и ключей напихать.

#!/bin/bash --posix

echo $POSIXLY_CORRECT

скажет «y».

emulek
()
Ответ на: комментарий от emulek

почему-бы тебе явно не написать

это и написано - если ты внимательно читал, то должен был заметить, что ./ололо работает как надо

megabaks ★★★★
() автор топика
Ответ на: комментарий от megabaks

дык в чём твоя проблема?

If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.