LINUX.ORG.RU

Вопрос по Bash

 , , глобальные переменные


0

1

Почему Bash в скрипте не понимает $HOME и ~/, когда используешь их для записи пути в переменную.Т.е. например так:

var = $HOME/.folder/folder1/folder2
А абсолютные пути $HOME непосредственно в оболочке то все норм. Может я что-то в синтаксисе упускаю?

Ответ на: комментарий от Spirit_of_Stallman

Нет, я опечатался, у меня как раз без пробелов. И не работает. Bash не видит файлы, а они там есть.

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

Добро.
Давай перефразируем более точно, что бы я понимал что понимаю верно :)
Если ты в скрипте присваиваешь «var=$HOME/.folder/folder1/folder2» - у тебя var - пустой? Или только «/.folder/folder1/folder2»?

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

Ну у меня это тоже выводит.

echo $firefox_temp
/home/saymeit/.mozilla/firefox/ioxpxoog.default /home/saymeit/.mozilla/firefox/vgiggxb5.default
В чем смысл?)

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

Ну у меня это тоже выводит.

Всё, теперь я понял о чём ты.

В общем смотри:
когда ты не в шелле а в скрипте присваиваешь значение переменной - это не выполнение команды, а просто запись в неё просто текста.
Т.е. при попытке определения «firefox_temp=$HOME/.mozilla/firefox/*.default» оно просто записывает часть «$HOME/.mozilla/firefox/*.default» как обычный текст (ну и, конечно же, заменяет $HOME на нужный путь).

Так вот что бы добиться нужного тебе результата необходим более иерархический подход. Например

firefox_temp="$(find $HOME/.mozilla/firefox/ -maxdepth 1 -type f -name "*.default")"
сделает что тебе нужно. Тут мы делаем присвоение выхлопа работы программы find (т.е. в итоге это простой текст) переменной firefox_temp. А вот уже для того, что бы мы достигли выполнения команды шелла, используем заключение того, что хотим выполнить в $(), на деле - $(some command).

Принцип понятен?

Spirit_of_Stallman ★★★
()

Если так записать?

var1=${HOME}"/.folder/folder1/folder2"
var2=`echo ${HOME}`"/.folder/folder1/folder2"

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

когда ты не в шелле а в скрипте присваиваешь значение переменной - это не выполнение команды, а просто запись в неё просто текста.

Вы не правы. При присваивании имя переменной заменяется на её значение, если она не экранирована обратным слешем или одинарными кавычками.

Также происходит подстановка имен файлов.

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

Я за последствия, в данном случае, «на пальцах», а не механику.
Но по делу - это очень дельное замечание, для понимания принципов.
Спасибо.

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

Вобщем - да. Но я попробовал так написать в консоли, bash мне выдал после этого, что переменная firefox_temp пуста.

firefox_temp="$(find $HOME/.mozilla/firefox/ -maxdepth 1 -type f -name "*.default")"
echo $firefox_temp

reddaemon
() автор топика
Ответ на: комментарий от Spirit_of_Stallman
ls -lah $HOME/.mozilla/firefox/
итого 24K
drwxr-xr-x  5 saymeit saymeit 4,0K 2012-12-15 09:29 .
drwx------  4 saymeit saymeit 4,0K 2012-12-14 22:44 ..
drwx------  2 saymeit saymeit 4,0K 2012-12-21 13:02 Crash Reports
drwx------ 15 saymeit saymeit 4,0K 2012-12-25 17:01 ioxpxoog.default
-rw-rw-r--  1 saymeit saymeit   94 2012-12-15 09:29 profiles.ini
drwxr-xr-x  7 saymeit saymeit 4,0K 2012-12-15 01:22 vgiggxb5.default

Поменял двойные кавычки на одинарные, теперь сценарий работает без ошибок. Но остальная часть кода сообщает, что «файлов какбэ нет». Если я правильно написал её.

привожу код:

#!/bin/bash
firefox_temp='${find $HOME/.mozilla/firefox/ -maxdepth 1 -type f -name "*.default")'

  if [ -e '$firefox_temp' ]
     then `rm -rf $firefox_temp`
     else
         echo "Файлы не существуют"
  fi
exit 0

Т.е. опятьв же, если написать «/home/saymeit/». То все сработает и он их увидит и удалит.

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

В данном случае ошибка в том, что *.default это не файлы, а директории, т.е. команда должна выглядеть так

firefox_temp="$(find $HOME/.mozilla/firefox/ -maxdepth 1 -type d -name '*.default')"
Кроме того, я заменил внутренние кавычки на одинарные. Они работают в данном случае, но могут привести к проблемам в дальнейшем.

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