2015-05-24 2 views
1

У меня проблема, я просто не могу справиться в своем сценарии bash. Всякий раз, когда я пытаюсь скопировать с помощью cp в домашней папке в скрипте я получаюcp не может stat to ~/in script

cp: cannot stat '~/file.txt': no such file or directory 

Мой код выглядит следующим образом:

#!/bin/bash 
echo "file location" 
read a 
user inputs ~/file.txt 
b=$(basename $a) 
cp "$a" . /$b 

Пожалуйста, помогите, это, вероятно, простое решение, но я просто не могу выясните это.

+1

использовать полный путь. –

+0

Я хочу, чтобы иметь возможность использовать переменную, я не могу использовать ~/вместо/home/user? – JONAS402

ответ

2

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

d="~"; ls $d 
ls: cannot access ~: No such file or directory 

Используйте полный путь: /home/youruser/file.txt.

В качестве альтернативы, вы можете заставить подстановка с eval (но предпочитают не .. это Eval ..):

d=$(eval echo "$d") 
echo $d     # /home/user 
+0

Я решил использовать Eval, он будет использоваться только для того, чтобы получить исходный путь пользователя от ~/Я полностью ожидаю проблем где-то в очереди, но я не мог заставить readlink работать по мере необходимости: s – JONAS402

1

Вы могли бы сделать что-то вроде

expanded_path=$(echo "$d" | "s:^~:$HOME:") 

(то есть, subtstitute начальный ~ для $HOME вручную)

или заставить пользователя использовать полный путь. eval - это зло (определенно для ввода пользователем, это так). Если вы просто хотите скопировать в текущей директории, сохраняя при этом оригинальное имя, вы можете сделать:

cp "$src" . 

Не нужно играть с basename.

1

Вы можете просто заменить ~ с $HOME:

read a 
a=${a/\~/$HOME} 

~/file Теперь будет /home/user/file

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