LINUX.ORG.RU

[bash][dfm]Оно почему то всегда true.


0

1
#!/bin/bash

D_CONF="-fn -xos4-terminus-medium-r-normal--12-120-72-72-c-60-*-* -nb #cccccc -nf #111111 -sb #111111 -sf #cccccc"
DMENU="dmenu $D_CONF"
C_DIR="$HOME/.config/dfm/"
H_FILE="${C_DIR}dfm.last"
M_FILE="${C_DIR}dfm.mime"

cd_dir () {
    cd "$1"
    echo "`pwd`" > $H_FILE
    return 0
}

is_type () {
    if file --mime "$1" | grep "$2" &> /dev/null
    then
	return 0
    fi
    return 1
}

open_file () {
    eval "${1} \"${2}\"" &> /dev/null
    return 0
}

run_cmd () {
    cmd="echo Hello, ${USER}!"
    while [ "$cmd" ] ; do
	res=`eval "$cmd"`
	cmd=`echo "$res" | $DMENU -p sh`
    done
    return 0
}

run_program () {
    echo "${1}" | while read line
    do
	if is_type "${2}" "`echo $line | cut -f1 -d:`"
	then
	    open_file "`echo $line | cut -f2 -d:`" "${2}"
	    return 0 && break
	fi
    done
}

mime_po () {
    new_mime=`file --mime "$1" | cut -f2 -d: | awk '{print $1}' | sed -s 's/;//g'`

    po=`echo "" | $DMENU -p "Enter program for $new_mime: "`
    echo "${new_mime} :${po}" >> $M_FILE

    mime=`cat $M_FILE`
    return 0
}

if [ -d "$C_DIR" ]; then
    if [ ! -e "$M_FILE" ]; then
	echo Exit | `$DMENU -p "Create $M_FILE. Format: mime program"`
	exit 1
    fi

    if [ -e "$H_FILE" ]; then
	y_n=`echo -e "Yes\nNo" | $DMENU -p "Open last dir?"`
	if [ "$y_n" = "Yes" ]; then
	    cd_dir "`cat \"$H_FILE\"`"
	elif [ "$y_n" = "" ]; then
	    exit 0
	fi
    fi
elif [ ! -d "$C_DIR" ]; then
    mkdir -p $C_DIR
    echo Exit | `$DMENU -p "Create $M_FILE. Format: mime program"`
    exit 1
else
    return 0
fi

var=`ls`
mime=`cat $M_FILE`

while true; do
    if [ "$var" ]; then
        var=`echo -e "../\n$var" | $DMENU -p "dfm"`
    else
        var=`echo "../" | $DMENU -p "dfm"`
    fi

    if [ -d "$var" ]; then
	cd_dir "$var"
    elif run_program "$mime" "$var"
    then
	echo true
    elif [ "$var" = "shell:" ]; then
	run_cmd
    elif [ "`echo $var | awk '{print $1}'`" = "sh:" ]; then
	eval "`echo \"$var\" | cut -f2 -d:`"
    elif [ "$var" = "" ]; then
	exit 0
    else
	echo false
    fi

    var=`ls`
done

После просмотра файла(mplayer`ом к примеру) выскакивает true и в принципе всё правильно, но если я нажму Esc, то вместо выхода(elif [ «$var» = «» ]) выполниться echo true. Почему не доходит до exit 0?


> elif run_program «$mime» «$var»

Почему не доходит до exit 0?

А что, должно?

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

Да, ведь run_program завершается с 0 только при корректной связке $mime и $var.

tn1 ()

Покажи минимальный пример демонстрирующий проблему.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin
    elif run_program "$mime" "$var"
    then
	echo -e "$mime\n$var"

Переписал так. При пустом $var выдаёт $mime.

video/* :mplayer
text/* :urxvt -e emacs -nw
image/vnd.djvu :~/script/apvlv.sh
image/* :feh

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

facepalm.txt

У тебя сначала отрабатывает ветка elif run_program «$mime» «$var» , выполняющая программу. И, собственно, всё. До остальных веток управление не доходит. Поставь эту ветку _после_ всех остальных elif.

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

elif run_program «$mime» «$var» - это условие, тело оператора echo true.

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

> Ну и во что вычисляется это условие?
Да, действительно забыл return 1 после цикла.

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