Открытие файла с обратной косой чертой в имени, используя переменную в bash
Сложное имя для простого вопроса. Я пытаюсь создать идиотскую программу для людей, с которыми я работаю, когда меня не станет. Я использую чтение, чтобы сохранить имя файла в качестве переменной. Когда я перетаскиваю файл из сгиба, имя которого имеет пробел (и, следовательно, обратный слеш), он не будет работать. Если я напишу имя прямо в нем работает. Примеры ниже.
$ read -re a
/Users/microuser/Desktop/han\ scans/D2GDVACXX_s8_0_7bp_Index_9_SL39794.fastq
$ echo $a
/Users/microuser/Desktop/han\ scans/D2GDVACXX_s8_0_7bp_Index_9_SL39794.fastq
$ echo "$a"
/Users/microuser/Desktop/han\ scans/D2GDVACXX_s8_0_7bp_Index_9_SL39794.fastq
$ head $a
head: /Users/microuser/Desktop/han\: No such file or directory
head: scans/D2GDVACXX_s8_0_7bp_Index_9_SL39794.fastq: No such file or directory
$ head "$a"
head: /Users/microuser/Desktop/han\ scans/D2GDVACXX_s8_0_7bp_Index_9_SL39794.fastq: No such file or directory
Однако, если я наберу его вместо использования переменной.
$ head -n 1 /Users/microuser/Desktop/han\ scans/D2GDVACXX_s8_0_7bp_Index_9_SL39794.fastq
@HWI-ST1280:209:D2GDVACXX:8:1101:2762:1973 1:Y:0:GATCAGA
если я возьму пробел в имени папки, использую переменную, то работает нормально.
2 ответа
Вам не нужно ставить обратную косую черту перед пробелом при чтении ввода и избегать использования -r
вариант как -r
Опция говорит, что не допускайте обратной косой черты, чтобы избежать каких-либо символов.
Это должно работать:
$ read -e a
/Users/microuser/Desktop/han scans/D2GDVACXX_s8_0_7bp_Index_9_SL39794.fastq
$ head "$a"
Имя файла не содержит обратную косую черту, только пробел. Обратная косая черта присутствует только потому, что какое-то приложение будет полезно использовать / показывать предварительно экранированную версию, как в автозаполнении bash.
Надеемся, что следующие примеры должны прояснить это:
# touch "some file.txt"
# ls -lsa som*
0 -rw-rw-r--. 1 foo bar 0 Oct 9 13:49 some file.txt
# read var
some file.txt
# echo $var
some file.txt
# ls -lsa $var
ls: cannot access some: No such file or directory
ls: cannot access file.txt: No such file or directory
# ls -lsa "$var"
0 -rw-rw-r--. 1 foo bar 0 Oct 9 13:49 some file.txt
# ls -lsa some\ file.txt
0 -rw-rw-r--. 1 foo bar 0 Oct 9 13:49 some file.txt
# ls -lsa "some file.txt"
0 -rw-rw-r--. 1 foo bar 0 Oct 9 13:49 some file.txt