Установка переменной типа VAR='asdf'
оставляет среду неизменной, а это означает, что программы, которые вы запускаете в том же сеансе, ничего не знают о VAR
и не сможет получить к нему доступ. Вам нужно такое поведение при написании сценариев оболочки.
export
, с другой стороны, является встроенной функцией bash, которая изменяет среду, делая экспортируемую переменную видимой для дочерних процессов, порожденных в текущем сеансе. Вы можете добиться того же, запустив VAR='asdf' %program_name%
.
env
— это не встроенная функция, а отдельная программа. На первый взгляд это работает точно так же, как когда вы VAR='asdf' %program_name%
, но на более низком уровне все становится немного сложнее. Сначала запускается env
. Он изменяет среду, затем выполняет команду с заданными аргументами. Такого же поведения вы можете добиться в своем собственном коде, используя системный вызов exec(3).
setenv
— это просто экспорт
в оболочках семейства csh, как указано в вашем ответе.
Просто w
rite it. ed
создаст файл для записи:
$ ed fred
fred: No such file or directory
w
0
?
q
$ ls fred
fred
Текст, который вы читаете, вероятно, написан для какой-то другой реализации ed
. Диагностический вывод не полностью согласован во всех реализациях редактора. Редактор, который вы используете, ведет себя так, как можно было бы ожидать от текущей реализации, то есть он выводит короткое диагностическое сообщение о том, что barney
не найден, и помещает вас в «командный режим». Помимо подробностей о том, что на самом деле говорит диагностическое сообщение , это то же самое, что и в вашем тексте.
Редактор ed
имеет понятие "имя файла по умолчанию". Когда вы запускаете редактор с помощью ed barney
, имя файла по умолчанию — barney
. Когда вы записываете буфер в файл с помощью w
, файл с именем файла по умолчанию перезаписывается буфером. Если файл не существует,он будет создан.
Вы устанавливаете имя файла по умолчанию из командной строки, как показано выше и в своем вопросе, но вы также можете установить его с помощью команды f
. Без аргумента команда f
выводит имя файла по умолчанию на терминал :
$ ed -p '*' myfile
myfile: No such file or directory
*f
myfile
*f my-other-file
my-other-file
*w
0
*q
$ ls -l my-other-file
-rw-r--r-- 1 myself myself 0 Nov 17 11:41 my-other-file
Если нет имени файла по умолчанию (вы запустили редактор без имени файла ), вам нужно либо установить имя файла по умолчанию с помощью f somename
перед записью файла с помощью w
, либо вы можете указать имя файла в w
в качестве аргумента. Использование w
с аргументом имени файла устанавливает имя файла по умолчанию как это имя, если не задано имя файла по умолчанию.
w myfile
изменяет здесь имя файла по умолчанию:
$ ed -p '*'
*w
?
*w myfile
0
*f
myfile
*q
w bar-file
не изменяет ли здесь имя файла по умолчанию (, так как оно уже задано в командной строке):
% ed -p '*' foo-file
foo-file: No such file or directory
*w bar-file
0
*f
foo-file
*q