2011-09-28 4 views
2

Надеюсь, кто-то может мне помочь. За последний месяц или около того я изучаю Bash ... У меня есть программа (простая программа изучения языка), которую я хочу установить и запустить из сценария.отслеживание сценария движущейся оболочки

У меня есть сценарий, который создаст новую папку и переместится в нее. То, как я это делаю в данный момент, ниже, хотя у меня были проблемы с массивами, которые я использую позже. Мне было интересно, есть ли более чистый способ получить новый путь к имени файла. Любая помощь или понимание будут оценены.

#!/bin/bash 

echo "# path to me ---------------> ${0}  " 
echo "# parent path --------------> ${0%/*} " 
echo "# my name ------------------> ${0##*/} " 

if [[ ! -d ${0%/*}/SomeNewFolder ]] && [[ ! -d ${0%/*}/../SomeNewFolder ]] 
then 
    mkdir ${0%/*}/SomeNewFolder 
    mv ${0} ${0%/*}/SomeNewFolder/${0##*/} 
fi 

echo ${0%/*} 
newpath=$(echo "${0%/*}/SomeNewFolder") 
echo $newpath 

Все самое лучшее, Бен
выход

+1

Кстати, эхо в backticks является антипаттерном, если вы точно не знаете, почему вы это делаете. См. Также http://partmaps.org/era/unix/award.html#echo – tripleee

ответ

2

Для ясности, я бы, вероятно, объявить имена переменных для ваши общие значения вместо постоянного повторного использования массива $ {0}. Также рекомендуется использовать переменные и строки.

Единственная серьезная проблема, которую я видел, выполнялась ./script.sh создавала бы $ 0 равным только имени файла, поэтому я добавляю «./» к началу в этом случае.

#!/bin/bash -u 

ME="${0}" 
if [[ ! "$ME" =~ /^\// ]]; then 
     ME="./$ME" 
fi 
PARENT="${ME%/*}" 
FILENAME="${ME##*/}" 
FOLDER="SomeNewFolder" 
NEW="$PARENT/$FOLDER" 

if [[ ! -d "$NEW" ]] && [[ "${PARENT%/*}" != "$FOLDER" ]]; then 
     mkdir "$NEW" 
     mv "$ME" "$NEW" 
fi 

echo "$PARENT" 
echo "$NEW" 
0

Ну, вы могли бы сделать что-то подобное, чтобы получить абсолютный путь:

PARENTPATH=$(cd "$(dirname "$0")" && pwd) 
NEWPATH=${PARENTPATH}/SomeNewFolder 
0

Установка и настройка программ более целесообразно из файла make. Конечно, сначала кажется пугающим, но основы, такие как то, что вы хотите, довольно просты. Для вашего проекта, вы бы в идеале иметь три элемента:

  1. программа
  2. вашего скрипт запустить
  3. вашего Makefile т.е. Установщик

Это распадается каждый из этих различных компонентов, что делает каждый из них легче управлять. Если вы разделите их вместе, вы можете переместить tar-файл на новый компьютер и переустановить его без каких-либо изменений. Bash - замечательный инструмент, но установщик - нет.

образца делают скрипт ниже:

.PHONY: all clean 
SCRIPT=yourScriptName.sh 
SUBFOLDER=someFolder 

all: $(SCRIPT) 

$(SCRIPT): $(SUBFOLDER) 
    cp $(SCRIPT) $(SUBFOLDER)  
$(SUBFOLDER): 
    mkdir $(SUBFOLDER) 
clean: 
    -rm -f $(SUBFOLDER)/$(SCRIPT) 
    -rmdir $(SUBFOLDER) 

ВАЖНО! make является незаметным! Эти отступы составляют вкладки не четыре пробела.

+0

Возможно, «Программа» была сильным словом.Это больше похоже на сценарий 400 строк bash, который может принимать пользовательский ввод и т. Д. ... часть установки действительно позволяет людям настроить его в первый раз, когда запускает скрипт. Я пытаюсь понять, может ли быть обновлен $ 0 ... Могу ли я использовать файл make для скриптов bash? «установщик» и «программа»? Я прочитаю страницу man make ... – beoliver

+0

@ user969617 Make может работать на что угодно, а скрипт оболочки по-прежнему является программой. :) В большинстве случаев персональные сценарии оболочки попадают в папку ~/bin для пользователей, но если вы намерены вытолкнуть ее для людей, тогда простой «установщик» будет хорошей формой. –

0
me="$0" 
newdir=SomeNewFolder 

if [[ $me =~ ^/ ]] ; then 
    full_path="$me" 
else 
    full_path="$PWD/$me" 
fi 
full_path="${full_path//\/\.\///}" # prettify 

path_to_me="${full_path%/*}" 
parent_dir="${path_to_me##*/}" 

if [ ! "$parent_dir" = "$newdir" ] ; then 
    mkdir -p "$path_to_me/$newdir" 
    mv -f "$full_path" "$path_to_me/$newdir/" 
fi 

В принципе похоже на то, что lunixbochs делает, но с некоторыми незначительными изменениями

    имена переменных
  1. нижнего регистра, чтобы не путать с переменными окружения
  2. грубо оценивает абсолютный путь
  3. -f и -p Потому что интерактивность никогда не бывает крутой, и почему не
+0

Это новый путь к файлу, который я пытаюсь выполнить. Итак, после создания каталога и перемещения туда. $ 0 относится только к тому, когда файл был запущен - обновляется ли он? – beoliver

+0

@ user969617: На каком вызове вы хотели бы узнать новый путь? Вы не можете присвоить значение '$ 0', но с тех пор, как я начал с копирования его значения в' $ me' и используя это, можно назначить новое значение этой переменной, например 'me = '$ path_to_me/$ newdir/$ {мне ## * /} "'. Теперь '$ me' - это полный путь к скрипту в новом месте. – Sorpigal

+0

Я понимаю, что скрипт в этом случае .command может найти свой путь, используя '$ {0}' или каталог '$ {0%/*}', но мой скрипт перемещается при первом запуске. скажем, когда мы запускаем скрипт 'dir = $ {0%/*}', когда мы перемещаем скрипт, мы должны использовать 'dir = $ {0%/*}/NewFolder'? Очевидно, что во второй раз, когда скрипт запускается, ничто из этого не требуется, поскольку 'dir = $ {0%/*}' будет работать. Может ли '$ {0}' быть покраснели каким-либо образом? поэтому его можно вызвать после того, как скрипт переместился и найдет новое местоположение? (без необходимости исправлять его с помощью '/ NewFile'? Это имеет смысл? Это не главная проблема, просто любопытство – beoliver

Смежные вопросы