Вот эта линия.
variable=`ls -A $1 | grep '[abc]'; ls -1 $1`
Я понимаю строку перед точкой с запятой, но не понимаю, как работает эта строка после точки с запятой. Она
after the command(variable assignment)
and then run the command after semi-colon?
Тогда следующая строка будет такой же?
variable=`ls -A $1 | grep '[abc]' | ls -1 $1`
Спасибо,
решение1
точка с запятой просто разделяет две последовательные команды. На странице руководства ( man bash
) говорится (в главеСписки):
Команды, разделенные знаком ;, выполняются последовательно.
например, следующая команда сначала выполняет команду foo
, а затем команду bar
.
foo; bar
Чтобы правильно проанализировать ваш пример, вам сначала придется построить его иерархическую модель:
variable=`ls -A $1 | grep '[abc]'; ls -1 $1`
можно разбить на (что-то внутри обратных кавычек) и (то, что внутри обратных кавычек).variable=
...
ls -A $1 | grep '[abc]'; ls -1 $1
обратные кавычки используются для получения вывода команды (см.Замена командыв man bash
); таким образом, вы присваиваете выходной сигнал целого ls -A $1 | grep '[abc]'; ls -1 $1
переменной.
вывод команды substutited представляет собой список файлов, соответствующих определенному шаблону (включая скрытые файлы), дополненный полным списком файлов (для чего бы это ни использовалось...)
решение2
Нет, это не одно и то же, последний перешел бы grep
в ls
(что, скорее всего, не то, что вам нужно). Точка с запятой просто разделяет две разные команды.
Во-первых, вы, вероятно, захотите начать использоватьболее новый, более гибкий $( ... )
вместо кавычек.
Возьмем в качестве примера:
$ var=`echo foo; echo bar`
$ echo "$var"
foo
bar
Вы можете думать, что обратные кавычки (или $( ... )
) возвращают то, что было выведено на стандартный вывод во время выполнения кода, содержащегося между ними.
В вашем случае он смотрит на вывод ls -A $1
once и ищет строку в своем выводе, содержащую a
, b
, или c
, а затем печатает вывод в виде одного столбца ls -1 $1
. В общем, это плохая идея,вам не следует разбирать ls.