LINUX.ORG.RU

$ echo $(echo -e 1\\n2)
1 2

$ echo "$(echo -e 1\\n2)"
1
2
ArcFi ()

Переводы строк убирает баш, когда превращает аргументы командной строки в char *argv[] для int main().

См man bash | grep -A25 'Command Substitution', man execv.

Можно посмотреть, что на самом деле возвращает $() так:

# ABYRVALG=$(ls /)
# set | grep ABYRVALG
ABYRVALG=$'bin\nboot\ndev\netc\nhome\nlib\nlib64\nlost+found\nmedia\nmnt\nopt\nproc\nroot\nrun\nsbin\nsrv\nsys\ntmp\nusr\nvar'

Вот эти \n - это переводы строки, по ним и отделаются аргументы. Можно сделать один большой аргумент, если забрать всё в кавычки (вообще покруг $-конструкий почти всегда нужны кавычки, иначе имена с пробелами всё портят) echo "$(ls -1)" выведет всё в неизменном виде.

Совет: если тебе нужно пройтись по файлам, никогда не используй for i in $(ls). Используй for i in *, find ... -exec ... \;, find .... -print0 | xargs -0 ..., в крайнем случае cat список_имён_файлов_разделённых_переводом_строки.txt | while read FILENAME; do ..... "$FILENAME"....; done.

PS ls -1 нужно только в интерактивном шелле, для скриптов ls выводит всё в один столбик.

legolegs ★★★★★ ()
Ответ на: комментарий от linearisation

и чо?

Кавычки.

всегда надо в двойные кавычки

Желательно, особенно если результат подстановки важен.

иначе никак?

Конкретно в данном случае только так.

ArcFi ()

Вывод ls -1 отличается echo $(ls -1).

В первом случае ты запускаешь команду, и она выводит что-то в stdout. Во втором случае запускается та же команда, bash берет вывод stdout и подставляет в качестве аргументов в команду echo, а та уже выводит аргументы в stdout. Да, echo берет аргументы и выводит их последовательно в одну строку; можешь проверить на echo one two three.

И нахрен это нужно, зачем все так запутали?

А как ты представляешь разделение параметров команды переносами строк?

P. S. А еще это отличается от echo "$(ls -1)".

Kroz ★★★★★ ()
Последнее исправление: Kroz (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.