Это - синтаксис для определения функции оболочки. Посмотрите раздел Shell Functions руководства Bash. Это начинается:
Функции Shell являются способом сгруппировать команды для более позднего выполнения с помощью единственного имени группы. Они выполняются точно так же, как "регулярная" команда. Когда название функции оболочки используется в качестве простого названия команды, список команд, связанных с тем именем функции, выполняется. Функции Shell выполняются в текущем контексте оболочки; никакой новый процесс не создается для интерпретации их.
Функции объявляются с помощью этого синтаксиса:
name () compound-command [ redirections ]
Это ожидает, что Вы введете составную команду. Например:
$ foo()
> {
> echo 'you said foo'
> }
$ foo
you said foo
Этот вывод:
$ ls -al /usr/lib/*valgrind*
drwxr-xr-x 2 root root 4096 Sep 30 00:01 .
drwxr-xr-x 24 root root 12288 Sep 30 00:00 ..
-rwxr-xr-x 1 root root 1816444 Jun 6 2014 cachegrind-x86-linux
указывает на то, что есть каталог с именем /usr/lib/*valgrind*
(скорее всего, только /usr/lib/valgrind
), который вы перечисляете. Самая большая подсказка в том, что вы видите записи каталога для .
и ...
.
Это объясняет, почему ls -al /usr/lib/memcheck-x86-linux
говорит, что файла не существует - это потому, что файл называется /usr/lib/valgrind/memcheck-x86-linux
.
Если вы не хотите перечислять каталоги и показывать их как одну запись, добавьте флаг -d
к ls
:
$ ls -ald /usr/lib/*valgrind*
drwxr-xr-x 2 root root 4096 Sep 30 00:01 /usr/lib/valgrind
Что касается того, почему scp
говорит "не обычный файл", так как вы не предоставили командную строку scp
или вывод, который я должен догадаться, но я догадываюсь, что это вывод, который ваш scp
выдает для аргумента, который вообще не является никаким файлом, потому что его не существует.
В то время как Майкл Гомер уже писал , что произошло, вот , почему это произошло (учитывая ваш комментарий к его ответу, я думаю, вы уже знаете, но другие, кто сталкивается с этим вопросом, могут не знать).
Вы ввели команду
ls -al /usr/lib/*valgrind*
Звездочки интерпретируются оболочкой еще до выполнения ls, заменяя ее списком имен файлов, соответствующих шаблону. Теперь, если есть только одно подходящее имя (скажем, / usr / lib / valgrind
), то, конечно, список будет содержать только это одно имя. Итак, фактически выполняется команда
ls -al /usr/lib/valgrind
. Теперь ls увидит, что ей задан единственный аргумент, и проверка этого единственного аргумента покажет, что это каталог. Поскольку вы не указали параметр -d
, для имен каталогов будет отображаться не запись каталога, а его содержимое. И поскольку ему было дано только одно одно имя каталога, он также не будет сначала печатать имя каталога (поскольку, если вы укажете одно имя каталога в качестве аргумента, не возникнет вопроса, к какому каталогу принадлежат перечисленные файлы; помните что ls
не знает, что имя каталога взято из расширения имени файла).
Если вы хотите узнать настоящее имя каталога (помните, буквальное значение / usr / lib / valgrind
было предположением (хотя и весьма вероятным); с тем же успехом оно могло быть /usr/lib/valgrind-3.7
), вы можете использовать
ls -ald /usr/lib/*valgrind*
Также обратите внимание, что если есть дополнительный скрытый каталог .valgrind
или скрытый файл, например .valgrind- foo
в / usr / lib
, ваша команда ls
будет показывать , а не , несмотря на параметр -a
, поскольку расширение оболочки не заботится о параметрах, которые вы предоставили ls
, а ls
тогда не будет знать, что вы хотите видеть и эти файлы, поскольку они не включены в вашем списке файлов. Поэтому, если вы хотите, чтобы мужчины были уверены, что файлы точек также перечислены в списке, вам придется использовать:
ls -ld /usr/lib/*valgrind* /usr/lib/.*valgrind*
Обратите внимание, что -a
не не здесь, поскольку указаны файлы точек в качестве аргументов безоговорочно перечислены в ls
. Конечно, если вы хотите перечислить содержимое любого каталога, имеющего valgrind
в своем имени, включая файлы точек, вам понадобится -a
, поскольку эти точки файлы не отображаются в командной строке после раскрытия. То есть, в этом случае вы должны использовать
ls -la /usr/lib/*valgrind* /usr/lib/.*valgrind*
. С другой стороны, если вас интересует содержимое каталогов, соответствующих . * Valgrind *
, но не содержащихся в них точечных файлов, вы ' d не использовать -a
.
Если вы используете bash
(и, возможно, также для других оболочек, но я не уверен), вы можете упростить предыдущие две команды до
ls -ld /usr/lib/{,.}*valgrind*
соответственно
ls -la /usr/lib/{,.}*valgrind*