2013-07-08 4 views
1

Это всегда ничего не возвращает: readlink $Somevar. Я могу иметь "${Somevar}", "$Somevar", $Somevar, или ${Somevar} - это не имеет значения. Я продолжаю печатать Somevar, и я знаю, что он имеет разумную ценность. Просто введите $Somevar на терминал (один раз, когда я эхо/«отлаживаю» мой скрипт, чтобы дать мне относительный путь и прервать), я даю абсолютный путь. Но я должен иметь возможность получить абсолютный путь в скрипте!Как прописать ссылку на путь из переменной?

Возможно ли вообще использовать readlink в сочетании с переменной? Я откровенно не знаю, как readlink даже «знает», что ему передается переменная. Я думал, что даже в скрипте он будет расширен оболочкой перед вызовом readlink. Я протестировал его в терминале (без скриптов) с помощью «~/_src». Единственный способ, которым это работает, - это написать, что без кавычек. Но если я присваиваю это значение переменной , то каждая другая функция на моей машине работает с ней, но readlink.

Как я могу получить абсолютный путь? Мне все равно, если я использую readlink. Я просто хочу получить абсолютный путь от родственника в скрипте.


UPDATE: (StackOverflow комментариев сломанные)

Я помечена как Linux. Я попросил readlink, потому что я также хочу перевести символические ссылки, но я прекрасно это делаю на отдельном шаге.

Кроме того, это не удается, а также: ABSDIR=`cd $RELDIR; pwd` дает

bash: cd: ~/_src/: No such file or directory 

(Который есть такой каталог, и cd будет найти его, если я печатаю, что точное имя папки на терминале.) Теперь я предполагаю, что ~/ расширяется самим терминалом.

Итак, нет способа обработать такие пути? По-видимому, все утилиты, которые, как я думал, обрабатывали этими путями, работали только потому, что терминал расширяет путь до их вызова.

ответ

2

На Cygwin, у меня есть такое же поведение, поэтому я добавляю флаг readlink, такой как -f, и он отлично работает:

readlink -f $Somevar 
+0

После того, стены, я прочитал еще один вопрос конкретно о тильде, который работает для всех относительных путей, которые я нашел. Решением является использование eval в переназначении вместо того, чтобы пытаться вставить eval в команду, которую вы хотите использовать с этим путем: '' '' eval echo $ {RELDIR //>} '' '' – SaburoutaMishima

4

Прежде всего, readlink немного отличается от Linux или OSX. Пометка вашего вопроса с ОС, а не bash - это лучшая идея, тем более, что readlink не является встроенным, а скорее исполняемым.

Во-вторых, если вы хотите получить абсолютный путь, почему это не название вашего вопроса?

Легкий и портативный способ получить абсолютный путь к директории является

ABSDIR=`cd $RELDIR; pwd` 

Файлы немного больше работы:

ABSFILE=`cd $(dirname $RELFILE); pwd`/`basename $RELFILE` 
+1

* Не забывайте кавычки, если вы применяете это к пути, содержащему пробелы. –

+0

Я добавил обновление к моему вопросу. Пожалуйста, прочитайте, если у вас есть идеи. Спасибо, что остановились! – SaburoutaMishima

+0

После того, как я ударил головой о стену, я прочитал еще один вопрос конкретно о тильде, который работает для всех относительных путей, которые я нашел. Решение состоит в том, чтобы использовать eval в переназначении вместо того, чтобы пытаться вставить eval в команду, которую вы хотите использовать с этим путем: '' '' eval echo $ {RELDIR //>} '' '' – SaburoutaMishima

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