Слегка сбит с толку вопрос о том, является ли printf в оболочке yash встроенной командой или нет

Если они находятся в одной файловой системе, вы можете жестко привязать их к общему каталогу и tar к этому каталогу .

В качестве альтернативы, если вы используете GNU tar, вы можете (с большей гибкостью) софт-линковать их к общему каталогу и с помощью опции -h архивировать файлы, на которые софт-линки указать на.

Страница руководства для последнего показывает :

-h , - разыменование

следовать символическим ссылкам; архивировать и выгружать файлы, которые они указывают в

FreeBSD tar поддерживает эквивалентные параметры, но называет их как pax (см. ниже).

Конечно, нет POSIX tar, который можно было бы использовать для сравнения. Если вы можете использовать pax , у него есть аналогичная опция -L :

-L
Если в командной строке указана символическая ссылка, указывающая на файл типа каталога или обнаруженный во время обхода файловой иерархии, pax должен архивировать файловую иерархию с корнем в файле, на который ссылается ссылка, используя имя ссылки в качестве корня файловой иерархии. В противном случае, если символическая ссылка, указывающая на файл любого другого типа, который pax обычно может архивировать, указана в командной строке или встречается во время обхода файловой иерархии, pax должен архивировать файл, на который ссылается ссылка, используя имя ссылки. Поведение по умолчанию, когда не указаны ни -H , ни -L , должно заключаться в архивировании самой символической ссылки.

Будь то жесткое связывание или мягкое связывание, в результате вам не нужно перемещать существующие файлы.Жесткое связывание изменяет ctime (временную метку) ваших файлов, а мягкое связывание - нет. Но мягкая компоновка (хотя и снижает необходимость нахождения в одной файловой системе) не всегда поддерживается реализациями tar, использующими идентичные параметры.

Исходное утверждение OP, по-видимому, указывает на то, что неудобно размещать все файлы в одном каталоге из-за некоторых ограничений со стороны приложения, которое их генерирует. Из разъяснения становится очевидным, что проблема в том, что все они имеют одно и то же имя файла. Хотя связывание в один каталог (и, например, кодирование их исходного имени каталога в общее расположение), безусловно, выполнимо, существуют и другие варианты для простого сбора файлов в один архив, сохраняя их существующие имена каталогов. Одним из недостатков этого является то, что это ограничивает возможность восстановления в произвольные места. Однако: самый простой способ передать в tar около 20 имен - через командную строку, например,

`tar czf myoutput.tar.gz $(find . -type f -name bigfile.dat)`

Только для 20 файлов, что вряд ли будет проблемой с длиной командной строки. Если бы это было большое количество файлов (или очень длинные пути), это усложнило бы задачу, поскольку реализации tar , как правило, не имеют возможности передавать список имен путей, кроме как в виде отдельных параметров командной строки. (см., например, Solaris ). Для них можно попытаться обойти ограничение, создавая архив поэтапно, но тогда это не сработает со сжатием.Некоторые реализации предоставляют опции для чтения списка имен файлов из файла. Параметр GNU tar -T (также FreeBSD) делает это. Другие программы могут предоставить третью альтернативу, считывая список имен файлов со стандартного ввода (как это было сделано с помощью pax , на который повлиял cpio ), но обычно tar этого не делает: он может прочитать содержимое файла со стандартного ввода.

14
23.01.2019, 20:51
2 ответа

Формулировку можно улучшить.

Если оболочка находится в режиме posix:set --posixly-correct:

Для обычных встроенных -модулей, которые не существуют в PATH, печатается:

pushd: a regular built-in (not found in $PATH)

Четкое описание. :Это встроенная функция, но в PATH нет исполняемого файла с таким же именем.

Однако для обычных встроенных -модулей, имя которых также присутствует в PATH, печатается:

echo: a regular built-in at /bin/echo

Что, по-видимому, подразумевает, что исполняемый файл в /bin/echo будет выполнен (, а не ). Я предлагаю заменить atна also found in PATH at:

.
echo: a regular built-in also found in PATH at /bin/echo

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


В режиме POSIX ни одна обычная встроенная функция не будет работать , если только она также не найдена в PATH.

Однако оба (POSIX )специальные:

break colon continue dot eval exec exit export
readonly return set shift times trap unset

И yash semi -специальный (не специальный для POSIX):

alias bg cd command false fc fg getopts jobs
kill pwd read true umask unalias wait

встроенные функции все еще работают.

-1
27.01.2020, 19:51

Оболочка Watanabe имеет три типа встроенных -модулей, подробно описанных в ее руководстве. Там же перечислены все встроенные -in команды, но из отсутствия какого-либо примечания о том, что эта команда является некой, следует сделать вывод, что это «обычная» встроенная -in команда. «специальные» или «полу -специальные» встроенные -. Обычные встроенные -входы не имеют маркировки.

printfявляется одним из таких "обычных" встроенных -. В основном режиме он всегда вызывается, независимо от того, найдена ли внешняя команда с таким именем.

$ PATH=/usr/bin
$ printf
printf: this command requires an operand
$ type printf
printf: a regular built-in at /usr/bin/printf
$
$ PATH=/
$ printf
printf: this command requires an operand
$ type printf
printf: a regular built-in (not found in $PATH)
$

Но когда установлена ​​опция оболочки posixly-correct, она является встроенной -только в том случае, если внешняя команда может быть найдена в PATH.

$ set --posixly-correct
$
$ PATH=/usr/bin
$ printf
printf: this command requires an operand
$
$ PATH=/
$ printf
yash: no such command `printf'
$

На самом деле это соответствует тому, что говорит Единая спецификация Unix, и говорится, по крайней мере, с 1997 года.

Он отличается от оболочки Z, оболочки 93 Korn, оболочки Bourne Again и оболочки Debian Almquist, ни одна из которых не реализует и не документирует такое поведение для обычных -встроенных модулей. Оболочка Z, например, документирует, что обычные встроенные -ins всегда найдены, до шага поиска PATH. То же самое относится и к оболочке Debian Almquist. И это то, что делают все эти оболочки, даже если они вызываются как shс их включением -в опции -POSIX.

% /bin/exec -a sh zsh -c "PATH=/ ; type printf ; printf"
printf is a shell builtin
zsh:printf:1: not enough arguments
% /bin/exec -a sh ksh93 -c "PATH=/ ; type printf ; printf"
printf is a shell builtin
Usage: printf [ options ] format [string...]
% /bin/exec -a sh bash --posix -c "PATH=/ type printf ; printf"
printf is a shell builtin
printf: usage: printf [-v var] format [arguments]
% /bin/exec -a sh dash -c "PATH=/ ; type printf ; printf"
printf is a shell builtin
sh: 1: printf: usage: printf format [arg...]
% 

Однако не работает printf, когда он не находится на PATH— это поведение оболочки PD Korn, оболочки Heirloom Bourne и оболочки MirBSD Korn; потому что у них вообще нет printfвстроенного -. & #9786;

% /bin/exec -a sh `command -v ksh` -c "PATH=/ ; type printf ; printf"
printf not found
sh: printf: not found
% /bin/exec -a sh `command -v oksh` -c "PATH=/ ; type printf ; printf"
printf not found
sh: printf: not found
% /bin/exec -a sh `command -v jsh` -c "PATH=/ ; type printf ; printf"
printf not found
sh: printf: not found
% /bin/exec -a sh mksh -c "PATH=/ ; type printf ; printf"
printf not found
sh: printf: not found
% ksh -c "type printf ; printf"
printf is a tracked alias for /usr/bin/printf
usage: printf format [arguments...]
% oksh -c "type printf ; printf"
printf is a tracked alias for /usr/bin/printf
usage: printf format [arguments...]
% jsh -c "type printf ; printf"
printf is hashed (/usr/bin/printf)
usage: printf format [arguments...]
% mksh -c "type printf ; printf"
printf is a tracked alias for /usr/bin/printf
usage: printf format [arguments...]
$
6
27.01.2020, 19:51

Теги

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