В Вашем втором примере, путем размещения var и var2 на отдельных строках, это делает команду тем же как
while var=9876; var2=765; read line
while
команда допускает список команд прежде, чем выполнить команды в - цикл с условием продолжения. help while
шоу это:
в то время как: в то время как КОМАНДЫ; сделайте КОМАНДЫ;готово
Выполните команды, пока тест успешно выполняется.
Разверните и выполните КОМАНДЫ пока заключительная команда в
'в то время как' КОМАНДЫ имеют статус выхода нуля.
Статус выхода: Возвращает состояние последней выполняемой команды.
С другой стороны, когда переменное присвоение предшествует команде (в этом случае read
), и то присвоение только сопровождается пробелом, объем той переменной локален для команды ONLY! (внутренне)...
См.: В, 'в то время как IFS = чтение..', почему IFS не имеет никакого эффекта?
Я не думаю, что энергия имеет эту функцию. Одна альтернатива должна изменить копию и установить метку времени соответственно, например:
cp -p post temp
vim temp
touch -r post temp
cp -p temp post
Или еще лучше:
touch -r post timestamp
vim post
touch -r timestamp post
Я записал сценарий Perl для этого.
Это - обертка вокруг энергии, сохраненной в ~/bin/vim-nomtime.pl
и принесенный в использование через alias vim='~/bin/vim-nomtime.pl'
в моем .bashrc.
#!/usr/bin/perl
use strict;
use warnings;
use Cwd qw/ abs_path /;
my @dirs = qw( ~/blosxom /srv/relief/blosxom );
s/^~/$ENV{HOME}/ foreach @dirs;
# do we want to preserve stamp on this file?
sub fits {
my $dir = abs_path($_[0]);
my $fits = 0;
foreach (@dirs) {
my $preserved_dir = abs_path($_);
$fits++ if $dir =~ m|^$preserved_dir|;
}
return $fits != 0;
}
# store original stamps
my $original_stamp;
foreach (@ARGV) {
if ( -f $_ and fits($_) ) {
$original_stamp->{$_} = (stat($_))[9];
}
}
# run vim as you would
my $cmd = join ' ', 'vim', @ARGV;
system($cmd) == 0
or die "vim failed: $!";
# restore stamps if they have changed
foreach (keys %$original_stamp) {
next unless -f $_;
my $current_stamp = (stat($_))[9];
unless ($current_stamp == $original_stamp->{$_}) {
utime $original_stamp->{$_}, $original_stamp->{$_}, $_;
}
}
Некоторые хорошие функции:
поддержки несколько имен файлов
поддержки несколько "наблюдаемых" директоров
поддержки symlinked dir
может быть улучшен с другими критериями
большинство которых могло быть, вероятно, также достигнуто с чистой версией энергии. Недостатки этого решения по сравнению с моим желаемым решением чистой энергии:
это восстанавливает штамп только после того, как энергия вышла, поэтому если я делаю долгое редактирование и регулярно сохраняю, деревня файла "всплывающее окно" как новое, пока я не вышел из энергии
это поддерживает несколько файлов на командной строке, но довольно наивным способом - это только проверяет если вещь на @ARGV
файл. Это, вероятно, не работало бы с подстановочными знаками (например. vim note-*.txt
) или другой забавный материал
это не доказательство катастрофического отказа, вероятно, даже НЕ ПОНУКНИТЕ защищенный (который мог быть сделан),
... wel, это - обертка. (Я имею в виду, если бы мы решили все через обертку, сколько оберток мы имели бы, прежде чем что-то плохо произошло?)
Если у Вас должна быть некоторая забава:
file=path; mtime=$(stat -c %y "$file"); vi "$file"; touch -d "$mtime" "$file"
Путь замены с Вашим фактическим путем к файлу
Этот короткий сценарий сохранит измененное время, если какой-либо родительский dir файла будет содержать a .nomtime
файл:
#!/bin/bash
dir="${1%/*}"
[ "$dir" = "$1" ] && dir=.
dir=$( readlink -f "$dir" )
nomtime=
while [ -n "$dir" ]; do
if [ -f "$dir/.nomtime" ]; then
nomtime=1
break
fi
dir="${dir%/*}"
done
if [ "$nomtime" = 1 ]; then
T=`tempfile`
touch -r "$1" $T
fi
vi "$1"
if [ "$nomtime" = 1 ]; then
touch -r $T "$1"
rm $T
fi
Попробуйте эту bash
функцию (на основе ответа Shâu Shắc)
vi-preserve-time () {
for file in "$@"; do
local mtime=$(stat -c %y "$file")
vi "$file"
touch -d "$mtime" "$file"
done
}
Теперь мы можем редактировать файл и сохранять измененное время, используя это
vi-preserve-time file1.txt file2.txt
Существует возможность скопировать метку времени из другого файла.
touch -m -r file_source file_target
Пример:
[oracle@es abc]$ ls -tlr
total 4
-rw-r--r--. 1 oracle oinstall 102 May 8 20:35 aa.txt
[oracle@es abc]$ echo "hi hi" > b
[oracle@es abc]$ ls -ltr
total 4
-rw-r--r--. 1 oracle oinstall 102 May 8 20:35 aa.txt
-rw-r--r--. 1 oracle oinstall 6 May 13 18:58 b
[oracle@es abc]$ touch -m -r aa.txt b
[oracle@es abc]$ ls -tlr
total 8
-rw-r--r--. 1 oracle oinstall 6 May 8 20:35 b
-rw-r--r--. 1 oracle oinstall 102 May 8 20:35 aa.txt
[oracle@es abc]$ cat b
hi hi
Я нашел отличное решение на этой веб-странице , которая создает функцию vim для сохранения текущего файла с сохранением существующего времени модификации,и привязывает эту функцию к функциональной клавише F4 :
Однако я обнаружил, что исходная функция содержит небольшую ошибку, вызывающую следующее предупреждение, если F4 используется дважды для одного и того же файла, потому что vim путается при изменении времени модификации:
WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?
К счастью, это легко исправить. :Я добавил команду «редактировать» к исходной функции, чтобы перезагрузить файл после восстановления метки времени, чтобы vim знал, какое время изменения ожидается для файла.
Вот измененная функция vim с этим исправлением ошибки, которую можно добавить в~/.vimrc
:
function! WriteSmall()
let mtime = system("stat -c %.Y ".shellescape(expand('%:p')))
write
call system("touch --date='@".mtime."' ".shellescape(expand('%:p')))
edit
endfunction
map <F4> :call WriteSmall()<CR>
Примечание.:Эта функция основана на версиях GNU date
, stat
и touch
.