Найдите встроенную команду times
и добавьте к вашему файлу строку .profile
, чтобы при вашем выходе из системы интерпретатор выдавал использованное вами процессорное время.
Напишите программу, находящую следующий свободный идентификатор пользователя в файле /etc/passwd
. Если у вас есть энтузиазм (и право доступа), сделайте из нее команду, устанавливающую нового пользователя системы. Какие нужны для нее права доступа? Как следует ей обращаться с прерываниями?
5.5 Команда overwrite
: замена файла
В команде sort
есть флаг -о
для замены файла:
$ sort файл1 -о файл2
Ее эквивалент:
$ sort файл1 > файл2
Если файл1
и файл2
— это один и тот же файл, то после операции переключения >
входной файл станет пустым перед сортировкой. Но с флагом -о
команда выполняется правильно, потому что входной файл сортируется и сохраняется во временном файле перед созданием выходного файла.
Могут использовать флаг -о
и другие команды. Например, редактор sed
может редактировать файл с заменой:
$ sed 's/UNIX/UNIX (TM)/g' -o ch2
Так не получится!
Непрактично изменять все подобные команды, вводя флаг — это не лучшее решение. Более целесообразным представляется централизованное выполнение функций, как в случае операции >
интерпретатора, для чего мы создадим программу overwrite
. Первый ее вариант выглядит так:
$ sed 's/UNIX/UNIX (TM)/g' гл2 | overwrite гл2
В основном алгоритм программы очевиден: нужно только сохранить где-нибудь весь входной поток вплоть до конца файла, а затем копировать его в файл, указанный как аргумент:
# overwrite: copy standard input to output after EOF
# version 1. BUG here
PATH=/bin:/usr/bin
case $# in
1) ;;
*) echo 'Usage: overwrite file' 1>&2; exit 2
esac
new=/tmp/overwr.$$
trap 'rm -f $new; exit 1' 1 2 15
cat >$new # collect the input
cp $new $1 # overwrite the input file
rm -f $new
Команда cp
используется вместо команды mv
, чтобы не изменились права доступа и остался прежним владелец выходного файла, если он уже существует. Хотя этот вариант и чрезвычайно прост, здесь возможна "фатальная" ошибка: если пользователь нажмет клавишу cp
, первоначальный выходной файл будет уничтожен. Необходимо соблюдать осторожность, поскольку прерывание может остановить замену входного файла:
# overwrite: copy standard input to output after EOF
# version 2. BUG here too
PATH=/bin:/usr/bin
case $# in 1) ;;
*) echo 'Usage: overwrite file' 1>&2; exit 2
esac
new=/tmp/overwr1.$$
old=/tmp/overwr2.$$
trap 'rm -f $new $old; exit 1' 1 2 15
cat >$new # collect the input
cp $1 $old # save original file
trap '' 1 2 15 # we are committed; ignore signals
cp $new $1 # overwrite the input file
rm -f $new $old
Если клавиша cp
не прервется. Если команда cp
начала выполняться, команда overwrite
обязана заменить исходный файл.
Здесь есть некоторая тонкость. Рассмотрим последовательность:
$ sed 's/UNIX/UNIX(TM)g' special | overwrite special
command garbled: s/UNIX(TM)g
$ ls -l special
-rw-rw-rw- 1 you 0 Oct 1 09:02 special #$%@*!
$
Если в программе, поставляющей входной поток для команды overwrite, произойдет ошибка, то выходной поток будет пустым, и overwrite
обязательно (с сознанием выполненного долга) уничтожит файл, заданный в качестве аргумента.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии