2014-11-18 3 views
0

Я написал скрипт для изменения каталога (cd), прочитав значение для cd из файла. Но когда я запускаю этот скрипт, я сталкиваюсь с ошибкой «Нет такого файла или каталога».Cd 'ing в каталог, прочитав аргумент для' cd 'из файла

Это сценарий, я написал:

#!/bin/bash 
while read line 
do 
IN=$line 
set -- "$IN" 
IFS=":"; declare -a Array=($*) 
echo "File location : ${Array[1]}" 
location=${Array[1]} 
echo "Location : $location" 
cd "$location" 
echo "Pwd :" 
pwd 
done < location.properties 

Содержание location.properties файла:

A:~/Downloads 

Выход:

File location : ~/Downloads 
Location : ~/Downloads 
./script.sh: line 10: cd: ~/Downloads: No such file or directory 
Pwd : 
/home/path/to/current/dir 

И эхо заявления печати расположение правильно, но cd к нему не удается. Любая помощь приветствуется! Заранее спасибо!

+1

«Расширение тильды применяется только в том случае, если« ~ »не кавыдается». http://mywiki.wooledge.org/BashPitfalls#echo_.22.2BAH4.22 – fedorqui

+0

BTW - 'Array = ($ *)' очень сломан. Вероятно, вам нужно «Array = (« $ @ »)', если вы хотите сохранить аргументы с указанными/экранированными пробелами, подстановочными знаками и т. Д. Это означает, что у вас есть все основания копировать содержимое в отдельный массив вообще, см. здесь. –

+0

Кстати - какая у тебя раковина? Я принимал POSIX-совместимый ksh-производный, но если это что-то не-POSIX, такое как zsh, это может изменить ситуацию. –

ответ

1

~ не распространяется по котировкам. Обычно я предлагаю рассматривать его только как интерактивную функцию и недоступен в сценариях, поскольку побочные эффекты от некотируемых расширений в сценариях не стоят того особого преимущества.

Для выполнения этой операции расширения себя:

if [[ $location = "~/"* || $location = "~" ]]; then 
    location=$HOME/${location#"~"} 
elif [[ $location = "~"?* ]]; then 
    user=${location%%/*} 
    user=${user#"~"} 
    read _ _ _ _ _ home _ < <(getent passwd "$user") 
    location="$home/${location#*/}" 
fi 

Конечно, это перебор, а обычная практика предположить, что сценарии не будут обрабатывать пути, содержащие ~, если не раскрывается до их вызова (как на вызывающая оболочка).

+0

+1 для расширения ~ пользователя, а также для заметок на излишнем! –

+0

Я использовал это, но я все равно получаю ту же ошибку. Ошибка: script.sh: строка 21: cd: $ HOME/Скачиваний: Нет такого файла или каталога – Malick

+0

@Malick ... так. Это означает, что '$ HOME' был выпущен нерасширенным. Точный код, который я дал здесь, не делает этого. Возможно, вы использовали одиночные кавычки вокруг '' $ HOME''? На самом деле важно, чтобы он был либо без кавычек (что безопасно только потому, что это часть задания), либо с двойным кавычкой. –

0

либо удалить кавычки $ месте (как это было предложено другими комментариями уже) или, если вам нужны котировки по какой-то причине, префикс команды с «Eval», как: Eval CD «$ местоположение» У меня есть только попробовал метод eval (с кавычками около ~), и он работает.

+0

Метод eval будет ломаться точно так же, и в тех же местах, что и просто-удаление-кавычки. Попробуйте сделать это с именами файлов, содержащими пробелы. –

+0

... также см. BashFAQ # 48 re риски, связанные с 'eval': http://mywiki.wooledge.org/BashFAQ/048 –

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