2012-03-31 2 views
0

У меня есть строка в сценарии bash, которая ищет папку с помощью find и сохраняет ее путь.«найти» удаление нескольких пробелов в bash

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

findfolder=$(eval echo $(eval "find "$HOME" -iname "$find_regex" -type d -print 2>/dev/null | sort -d | head -1")) 

и она работает практически в любом случае, но по какой-то причине, если я ищу папку, которая имеет два места в нем, он будет возвращать путь где все двойные пространства были отключены для одиночных пробелов.

Так что, если я ищу папку под названием «Моя музыка» с двумя пробелами между «My» и «музыка», он будет возвращать «Моя музыка» одним пробелом.

Если я запускаю ту же самую команду непосредственно в терминале, я получаю правильную папку.

Почему это происходит? (Дайте мне знать, нужен ли больше кода. Не кажется актуальным, так как я запускал ту же самую команду из терминала. Не хочу, чтобы стена без видимой причины теперь была нами).

редактировать:

Он сейчас работает. Первый eval или echo (не уверен, но мои тесты показывают, что это был eval) приводило к сбою вывода, удаляя «ненужный» интервал. Рабочий код:

findfolder="$(eval "find "$HOME" -iname "$find_regex" -type d -print 2>/dev/null | sort -d | head -1")" 
+1

Интересно. Но вам нужен двойной $ ($()) и evals? –

+0

@ PéterVarga Ну, я не работал, пока не использовал eval. Они исправили проблему с назначением выводов переменной с использованием эха. – keyser

+1

@ PéterVarga Теперь я решил это. Первый eval и echo не нужны, и это приводит к краху. Странно, что я в какой-то момент обнаружил, что они были необходимы – keyser

ответ

3

Я не понимаю, что вы пытаетесь сделать с утверждениями eval. Однако вы можете поэкспериментировать с цитированием подстановки команд. Обратите внимание на разницу между следующими двумя командами:

# the two spaces between foo and bar are collapsed 
echo $(echo "foo bar") 

# the two spaces between foo bar bar are kept 
echo "$(echo "foo bar")" 
Смежные вопросы