В то время как возможно переименовать пользователя, и usermod
сделает часть задания, это, довольно вероятно, доставит неприятности. Вот список мест, где имя пользователя может появиться; я не утверждаю, что этот список является исчерпывающим.
/etc/passwd
и связанные файлы (например. /etc/shadow
, /etc/master.passwd
)./etc/group
(и /etc/gshadow
)./etc/sudoers
./var/mail/$USER
или /var/spool/mail/$USER
./var/spool/cron/crontabs/$USER
at
задания (/var/spool/cron/atjobs/*
)Корневой каталог, вероятно, появится еще в большем количестве мест. Много приложений пишут полные пути в различных точечных файлах. Если Вы решаете переименовать корневой каталог также (в то время как нет никакого требования того пользователя alice
корневой каталог быть /home/alice
, наличие его быть /home/bob
сбивало бы с толку), необходимо будет заботиться о тех. Глобальная замена будет работать на большинство приложений, но я не делаю обещаний. Если возможно, сохраните старое название корневого каталога как символьную ссылку на переименованный каталог.
(Извините, долгое объяснение)
Да, IFS
переменная в while IFS=" " read; do …
не имеет никакого эффекта на остальную часть кода.
Позвольте нам сначала точный что функции командной строки оболочки два различных видов переменных:
fork()
и exec()
, таким образом, дочерние процессы наследовали их.Когда Вы называете команду с:
A=foo B=bar command
команда выполняется в в среде где (среда) переменная A
установлен на foo
и B
установлен на bar
. Но с этой командной строкой, текущими переменными оболочки A
и B
оставлены без изменений.
Это отличается от:
A=foo; B=bar; command
Здесь, переменные оболочки A
и B
определяются и команда выполняется без переменных среды A
и B
определенный. Значения A
и B
недоступны от command
.
Однако, если некоторые переменные оболочки export
- редактор, соответствующие переменные среды синхронизируются с их соответствующими переменными оболочки. Пример:
export A
export B
A=foo; B=bar; command
С этим кодом обе переменные оболочки и переменные среды оболочки установлены на foo
и bar
. Так как переменные среды наследованы подпроцессами, command
сможет получить доступ к их значениям.
Переходить назад к Вашему исходному вопросу, в:
IFS='a' read
только read
затронут. И на самом деле, в этом случае, read
не заботится о значении IFS
переменная. Это использует IFS
только, когда Вы просите, чтобы строка была разделена (и сохранена в нескольких переменных), как в:
echo "a : b : c" | IFS=":" read i j k; \
printf "i is '%s', j is '%s', k is '%s'" "$i" "$j" "$k"
IFS
не используется read
если это не называют с аргументами. (Редактирование: Это не точно верно: пробельные символы, т.е. пространство и вкладка, существующая в IFS
всегда игнорируются в начале/конце входной строки.)
Поместите его простой, необходимо читать больше чем в одну переменную за один раз для IFS=<something> read ...
создайте, чтобы иметь видимый эффект в Вашем examples1.
Вы пропускаете объем read
в примерах. Нет никакой модификации IFS в цикле в Ваших тестовых сценариях. Позвольте мне указывать точно, где делает вторую IFS, имеют ее эффект в каждой из Ваших строк:
IFS=$' \t\n'; xifs "$IFS"; echo "$data" | while IFS=b read; do echo ...
^ ^
| |
from here --' `- to here :)
Это так же, как с любой программой, выполненной в оболочке. Переменная, которую Вы (ре) определяете в командной строке, влияет на выполнение программы. И только что (так как Вы не экспортируете). Поэтому сделать использование переопределенных IFS
в такой строке необходимо было бы спросить read
присваивать значения больше чем одной переменной. Взгляните эти примеры:
$ data="a b c"
$ echo "$data" | while read A B C; do echo \|$A\|$B\|\|$C\|; done
|a|b||c|
$ echo "$data" | while IFS= read A B C; do echo \|$A\|$B\|\|$C\|; done
|a b c||||
$ echo "$data" | while IFS='a' read A B C; do echo \|$A\|$B\|\|$C\|; done
|| b c|||
$ echo "$data" | while IFS='ab' read A B C; do echo \|$A\|$B\|\|$C\|; done
|| || c|
1, Как я только что узнал от Gilles, могло бы на самом деле быть преимущество установки IFS=''
(пробел) при чтении только одного поля: это избегает усечения пробела в начале строки.
IFS= read
используемый в предпочтении только к сбросу переменной среды IFS". У меня не было осведомленности, затем, что локальные переменные могли быть установлены вызывающей стороной команды. Это было ответом на тот вопрос. Это действительно развивалось далее к обращению к основному моменту этого вопроса, но к тому времени, когда я понял, что, уже задал этот вопрос... Возможно, эти два вопроса так же подобны как два sed
вопросы, таким образом, мое чувство это для хранения его как есть... Больше заголовков для сотрудников Google к Google.
– Peter.O
18.08.2011, 00:47
$IFS
удалены в начале/конце входной строки, я предполагаю? (Который является, как это работает.) – zrajm 28.07.2014, 08:22