bash script - ошибка перехода в каталог с тильдой

Автор sunjob, 26 октября 2015, 02:19:58

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

sunjob

в функцию на баше отправляется параметр "путь к другому скрипту с тильдой", вида

~/PATH_TO_FILE/FILE

в функции происходит парсинг на путь и имя файла, при попытке перейти в каталог, выдается сообщение ошибки
если тут же копипастом вставить к ком. строку просмотр каталога 'ls -ld' - то каталог видится
если так же сделать cd - тоже все нормально

если вызывающий аргумент подрихтовать и тильду заменить на нормальный путь /home/$USER
то в функции переходит происходит нормально

func            '~/PATH_TO_FILE/FILE' - error
func  '/home/$USER/PATH_TO_FILE/FILE' - OK


если просто в терминале набрать переход с тильдой то все нормально:
cd ~/PATH_TO_FILE/

далее кусок функции и эхо вывод


#!/bin/sh

func()
{
    SCRIPT=$(basename "$1")
SCRIPT_DIR=$(dirname  "$1")

echo "
'$1'
'$SCRIPT_DIR'
"
# пробовал "оба варианта"
cd   $SCRIPT_DIR       
cd   $(dirname  "$1")

...

}

вызов функции

func            '~/PATH_TO_FILE/FILE' - error
func  '/home/$USER/PATH_TO_FILE/FILE' - OK

...

run_prc.sh: line 80: cd: ~/PATH_TO_FILE: No such file or directory

cd ~/PATH_TO_FILE - OK

...


менять путь - не катит


/bin/bash-3.1.17 
/bin/bash-3.2.57 
/bin/bash-4.3.30


slackware-12.2

* Используйте теги для оформления сообщения, ihammers.


sunjob

//
// run.sh
//

#!/bin/sh
clear; set -e

func()
{
echo "ARG1 = $1"
cd    $1
pwd
}

LST=01.lst

while read LINE
do
echo "LINE = $LINE"

ARG=$(echo $LINE | cut -d ' ' -f1)
ARG=${ARG// /}
func $ARG
done < $LST


//
// 01.lst
//
~/tmp  sss

//
// вывод
//
LINE = ~/tmp  sss
ARG1 = ~/tmp
./run.sh: line 7: cd: ~/tmp: No such file or directory


//
// куда указывает /bin/sh?
//

написал же

/bin/bash-3.1.17 
/bin/bash-3.2.57 
/bin/bash-4.3.30


//
// от кого запускается скрипт?
//
от себя, т.е от пользователя

ihammers

Цитата: sunjob от 26 октября 2015, 05:26:36// куда указывает /bin/sh?
//

написал же


/bin/bash-3.1.17
/bin/bash-3.2.57
/bin/bash-4.3.30
Что-то слишком много, он должен ссылаться на 1 интерпретатор.
Debian GNU/Linux Stretch, kernel 4.9.0-5-amd64,
LXQt/KDE/OpenBox AMD Phenon X4 / 16Gb RAM / ATI HD7750 Silent
_______________________________
Debian GNU/Linux Stretch, kernel 4.9.0-5-amd64, LXQt/KDE/OpenBox
Acer Aspire One 722 AMD C60 / 4Gb RAM / ATI HD6290

ogost

у меня /bin/sh указывает на dash, причем это не я менял, а было по умолчанию. баш же указывается как /bin/bash.
предположу, что в слаке тоже /bin/sh не указывает на bash, а на dash, zsh или что-то другое.

sunjob

#5
bash

main$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 2015-09-04 20:32 /bin/sh -> bash

c /bin/zsh - так же не катит

Cообщение объединено 26 октября 2015, 12:17:26

весь сыр бор был из за того, что
- во первых параметр для функции берется строкой из файла, парсится, берется первое второе третье поле и отправляется в функцию
- во вторых в данном случае намного удобнее пользоваться и писать тильду, чем каждый раз ПОЛНЫЙ путь (т.е. заполнять файл, откуда берутся параметры)

п.с
решение найдено еще вчера, мне надо знать, что скажет думающая часть линуксоидов, неужели никто с подобным не сталкивался и как решали...

п.с.2
я же не здря во второй части привел упрощенный шаблон для понимания что к чему
run.sh, 01.lst, вывод


sunjob

#7
друг, возьми сриптец, запусти у себя, разберись что к чему там, откуда что берется и во что преобразовывается, не посчитай за труд ...

Cообщение объединено 26 октября 2015, 18:33:09

Цитата: ihammers от 26 октября 2015, 08:37:46он должен ссылаться на 1 интерпретатор.
                        

это как бы намек на то, что
- интерпретатор - баш
- у меня их "все есть"
- все пробовал
- все одинакого                  

как то так

vic5710

#8
Цитата: ogost от 26 октября 2015, 15:00:03
я обычно беру $HOME и не парюсь.
+1


Cообщение объединено 26 октября 2015, 22:46:45

Цитата: sunjob от 26 октября 2015, 02:19:58в функцию на баше отправляется параметр "путь к другому скрипту с тильдой", вида

~/PATH_TO_FILE/FILE

вот сейчас проверил:
cat tst.sh:

#!/bin/bash

func() {
cd $1
pwd
cd $2
pwd
}

func ~/temp ~/ISO


в консоли:

MacBook-Air-Vic:temp vic57$ ./tst.sh
/Users/vic57/temp
/Users/vic57/ISO

все отработало :-X

sunjob

#9
а вы когда будете внимательно читать?  >:(

вы вот сейчам проверьте мой код, для чего я его сюдава вставил то?


run.sh
01.lst


p.s.
решение найдено еще вчера, мне надо знать, что скажет думающая часть линуксоидов, неужели никто с подобным не сталкивался и как решали...

vic5710

#10
Цитата: sunjob от 26 октября 2015, 02:19:58в функции происходит парсинг на путь и имя файла, при попытке перейти в каталог, выдается сообщение ошибки
если тут же копипастом вставить к ком. строку просмотр каталога 'ls -ld' - то каталог видится
если так же сделать cd - тоже все нормально

если вызывающий аргумент подрихтовать и тильду заменить на нормальный путь /home/$USER
то в функции переходит происходит нормально
вот же ваши слова. я не вижу ошибки с тильдой.


Cообщение объединено 26 октября 2015, 23:30:21


MacBook-Air-Vic:temp vic57$ cat tst

func() {
cd $1
pwd
cd $2
pwd
}
MacBook-Air-Vic:temp vic57$ . tst
MacBook-Air-Vic:temp vic57$ func ~/temp ~/ISO
/Users/vic57/temp
/Users/vic57/ISO
MacBook-Air-Vic:ISO vic57$ func ~/temp '~/ISO'
/Users/vic57/temp
-bash: cd: ~/ISO: No such file or directory


не умножайте сущностей сверх необходимых

ZEN

#11
Ну, как-то так...

zen@intel:~$ TEST=$(eval "echo ~/pwd")
zen@intel:~$ echo $TEST
/home/zen/pwd
zen@intel:~$ TEST=$(eval "echo ~root")
zen@intel:~$ echo $TEST
/root
zen@intel:~$ TEST=$(eval "echo ~-")
zen@intel:~$ echo $TEST
/tmp
zen@intel:~$ TEST=$(eval "echo ~+")
zen@intel:~$ echo $TEST
/home/zen
zen@intel:~$


Только есть опасность, что вместо пути будет вписана команда rm -r -f ~/
Так что лучше попробовать использовать функцию из вот этого примера:
http://stackoverflow.com/questions/3963716/how-to-manually-expand-a-special-variable-ex-tilde-in-bash/29310477#29310477
или вообще не заморачиваться из-за тильды
Crimea is Ukraine

vic5710

Цитата: ZEN от 27 октября 2015, 00:05:17или вообще не заморачиваться из-за тильды
или не ставить лишних кавычек

MacBook-Air-Vic:~ vic57$ echo ~
/Users/vic57
MacBook-Air-Vic:~ vic57$ echo '~'
~
MacBook-Air-Vic:~ vic57$ echo "~"
~
MacBook-Air-Vic:~ vic57$

sunjob

ребята, смотрите выложенный скрипт, он полностью описывает и моделирует задачу!!!


run.sh
01.lst


п.с
решение найдено еще вчера, мне надо знать, что скажет думающая часть линуксоидов, неужели никто с подобным не сталкивался и как решали...

vic5710

#14

#!/bin/sh
clear; set -e
func()
{
echo "ARG1=$1"
cd  $1
pwd
}


LST=01.lst
while read LINE
do
echo LINE="$LINE"
ARG=$(echo "$LINE" | cut -d ' ' -f1)
#ARG=${ARG// /}   я не понял зачем это здесь
ARG=${ARG//'~'/$HOME}
func $ARG
done < 01.lst

но это костыль. в таких задачах надо использовать абсолютные пути или будете путаться все время