Файлы Valgrind/usr/lib не являются регулярными файлами Linux

Это - синтаксис для определения функции оболочки. Посмотрите раздел Shell Functions руководства Bash. Это начинается:

Функции Shell являются способом сгруппировать команды для более позднего выполнения с помощью единственного имени группы. Они выполняются точно так же, как "регулярная" команда. Когда название функции оболочки используется в качестве простого названия команды, список команд, связанных с тем именем функции, выполняется. Функции Shell выполняются в текущем контексте оболочки; никакой новый процесс не создается для интерпретации их.

Функции объявляются с помощью этого синтаксиса:

name () compound-command [ redirections ]

Это ожидает, что Вы введете составную команду. Например:

$ foo()
> {
> echo 'you said foo'
> }
$ foo
you said foo

2
25.07.2014, 23:28
2 ответа

Этот вывод:

$ 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 выдает для аргумента, который вообще не является никаким файлом, потому что его не существует.

7
27.01.2020, 21:51

В то время как Майкл Гомер уже писал , что произошло, вот , почему это произошло (учитывая ваш комментарий к его ответу, я думаю, вы уже знаете, но другие, кто сталкивается с этим вопросом, могут не знать).

Вы ввели команду

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*
1
27.01.2020, 21:51

Теги

Похожие вопросы