-a (архив) должен делать то, что требуется.
, однако, -t (сохранение времени изменения) является конкретной командой для выполнения этой команды.
-121--195318- Есть еще две проблемы с использованием # !/usr/bin/env
Это не решает проблему указания полного пути к интерпретатору, он просто перемещает его в env
.
env
не гарантировано в /usr/bin/env
, чем bash
гарантировано в /bin/bash
или python в /usr/bin/python
.
env
перезаписывает ARGV [0] на имя интерпретатора (e.. g bash или python).
Это предотвращает появление имени сценария в выходных данных ps
(или изменяет способ/место его отображения) и делает невозможным его поиск с помощью, например, ps -C scriptname.sh
[update 2016-06-04]
И третья проблема:
Изменение PATH - это больше работа, чем просто редактирование первой строки сценария, особенно когда сценарии такие правки тривиальны. например,
printf "% s\n" 1 i '#!' $ (тип -P python2). w | ed foo.py
Добавление или предварительное ожидание каталога к $ PATH довольно просто (хотя вы все еще должны изменить файл, чтобы сделать его постоянным - ваш ~/.profile
или что-либо еще - и это далеко не легко создать сценарий, ЧТО изменить, потому что ПУТЬ может быть установлен в любом месте сценария, а не в первой строке).
Изменить порядок каталогов PATH значительно сложнее.... и намного сложнее, чем просто редактировать #!
строка.
И у вас все еще есть все остальные проблемы, которые дает вам использование # !/usr/bin/env
.
@ jlliagre предлагает в комментарии, что # !/usr/bin/env
полезен для тестирования скрипта с несколькими версиями интерпретаторов, "только изменив их порядок PATH/PATH"
Если это необходимо, гораздо проще просто иметь несколько #!
строки в верхней части сценария (это только комментарии где угодно, кроме самой первой строки) и вырезать/копировать-и-вставить ту, которую вы хотите использовать сейчас, в первую строку.
В vi
это было бы так же просто, как перемещение курсора на #!
, затем введите dd1GP
или Y1GP
. Даже при таком тривиальном редакторе, как nano
, для копирования и вставки с помощью мыши потребуется несколько секунд.
В целом, преимущества использования # !/usr/bin/env
минимальны в лучшем случае, и, конечно, даже не близки к перевесу недостатков. Даже "удобное" преимущество во многом иллюзорно.
IMO, это глупая идея, продвигаемая определенным видом программистов, которые думают, что операционные системы не являются чем-то, с чем нужно работать, они являются проблемой , которую нужно работать (или игнорировать в лучшем случае).
PS: вот простой сценарий для изменения интерпретатора нескольких файлов одновременно.
хижина изменения.sh
:
#!/bin/bash
interpreter="$1"
shift
if [ -z "$(type -P $interpreter)" ] ; then
echo "Error: '$interpreter' is not executable." >&2
exit 1
fi
if [ ! -d "$interpreter" ] && [ -x "$interpreter" ] ; then
shebang='#!'"$(realpath -e $interpreter)" || exit 1
else
shebang='#!'"$(type -P $interpreter)"
fi
for f in "$@" ; do
printf "%s\n" 1 i "$shebang" . w | ed "$f"
done
Запустите его, например, как change-shebang.sh python2.7 * .py
или change-shebang.sh $ HOME/bin/my-experimental-ruby * .rb
Основная проблема сценария заключалась в том, что к моменту окончания цикла while (< >)
@ ARGv Вы должны получить счет arg перед петлей. И помните, что массивы perl основаны на нуле, поэтому вы должны вычесть 1 из счета.
Вот фиксированная версия, которая выдает запрошенный результат.
$ cat compare.pl
#!/usr/bin/perl
use strict;
use warnings;
my $numargs=@ARGV-1;
my %data=();
while (<>) {
my ( $key, $value ) = split;
push( @{ $data{$key} }, $value );
}
foreach my $key ( sort keys %data ) {
if ( @{ $data{$key} } >= $numargs ) {
print join( "\t", $key, @{ $data{$key} } ), "\n";
}
}
$ ./compare.pl file1 file2 file3
cmr03lsp CKEIFJ 60
dlp02sle VMCFIJGM 40
fji01dde AIDJFMGKG 25
Медлительность была вызвана эмулятором терминала rxvt, особенно когда он автоматически запускался в файле bspwmrc. Сейчас я использую xterm или терминатор, а bspwm работает быстро.
Я пытался найти причину с помощью strace, но не получил никакой информации о возможных проблемах.