Открытие файла с обратной косой чертой в имени, используя переменную в 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
Другие вопросы по тегам