Во-первых, [email protected]
не содержит имя сценария, он содержит только фактические аргументы командной строки. Вы должны напечатать $0
явно, чтобы напечатать имя сценария.
Вот два решения:
exec paste -d: <(seq 0 $#;) <(printf ' %s\n' "$0" "[email protected]";);
выше запускает утилиту paste
склеить (1) последовательность чисел от 0 до количества аргументов, приведенных, формируемого утилитой seq
, и (2) имя сценария и аргументы командной строки, напечатанные printf
, по одному в каждой строке. Каждая из команд seq
и printf
запускается в конструкции замещения процесса, причем каждый сгенерированный файл устройства, представляющий вывод команды (например, /dev/fd/63
в моей системе), передается в paste
.
exec printf '%s\n' "$0" "[email protected]"| awk '{ print(i++": "$0); };';
Вышеприведенные печатает имя сценария и аргументы командной строки, одна в каждой строке, и трубы их к awk
, который добавляет нужный префикс нумерации.
Следует отметить, что каждое из этих двух решений включает запуск по меньшей мере одного дополнительного системного процесса либо для замещения процесса, либо для трубопровода. Это в значительной степени гарантировано, что будет намного больше неэффективно, чем запуск встроенного for-loop bash, который не требует дополнительных процессов (при условии, что вы вызываете только встроенный материал внутри цикла, например printf
). В общем, встроенные команды/keywords/constructs почти всегда будут быстрее, чем запуск внешних исполняемых файлов.
Вы слышали неправильно, если вы не используете компьютер 286? Любой средний современный процессор не должен иметь проблем с эффективностью при работе с данными, находящимися в памяти. 2-й, когда/почему быстрее печатать аргументы? Третий любой код, который вы пишете в оболочке, которая производит нужный вам результат, будет более сложным, сложнее для понимания и сложнее понять кто-то другой. Жизнь слишком короткая, используйте инструменты, которые ваша среда дает вам бесплатно ;-) !! Удачи. – shellter