Я предположу, что Ваша команда фильтрации - то, что я назову фильтром уменьшения префикса, который имеет свойство, что байт N в выводе никогда не пишется прежде считал, по крайней мере, N байты входа. grep
имеет это свойство (как долго, поскольку оно только фильтрует и не делает другие вещи как добавление номеров строки для соответствий). С таким фильтром можно перезаписать вход, как Вы продвигаетесь. Конечно, необходимо быть уверены в не делании любой ошибки, так как перезаписанная часть в начале файла будет потеряна навсегда.
Большинство инструментов Unix только дает выбор добавления в файл или усечения его без возможности перезаписи его. Одно исключение на стандартной панели инструментов dd
, которому можно сказать не усечь его выходной файл. Таким образом, план состоит в том, чтобы проникнуть команду в dd conv=notrunc
. Это не изменяет размер файла, таким образом, мы также захватываем длину нового содержания и усекаем файл к той длине (снова с dd
). Обратите внимание, что эта задача по сути неустойчива — если ошибка происходит, Вы самостоятельно.
export LC_ALL=C
n=$({ grep -v foo &1 | wc -c)
dd if=/dev/null of=big_file bs=1 seek=$n
Можно записать примерно эквивалентный Perl. Вот быстрая реализация, которая не пытается быть эффективной. Конечно, можно хотеть сделать начальную букву, фильтрующую непосредственно на том языке также.
grep -v foo ) {print}
truncate STDOUT, tell STDOUT or die
' big_file
Я не знаю о значениях по умолчанию на Fedora, но на Debian sudo
значения по умолчанию к использованию secure_path
опция со значением по умолчанию /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
.
Это означает, что путь изменяется на то значение каждый раз, когда Вы используете sudo
; но когда Вы используете sudo -i
, путь изменяется после этого полностью файлы RC пользователя.
Можно проверить это довольно легкое с вещами как
Сравните вывод от
sudo env
env
И вещи как
sudo whoami
whoami
Тем путем можно попытаться узнать то, что отсутствует в установке.
/usr/local/bin
не находится в моем sudo ENV, но это находится в моем корневом ENV и пользовательском ENV. Почему это? возвраты
– beatgammit
05.07.2011, 12:16
root
, как ожидаемый. Что могло заставлять мой sudo ENV отличаться, чем мой корневой ENV?
– beatgammit
05.07.2011, 12:19
/usr/local/bin
к пути корня (я должен был сделать это вручную, к сожалению)?
– beatgammit
05.07.2011, 12:21
sudo -i
команда моделирует начальный вход в систему. В моей системе Debian это также указывает что:
Это означает, что определенные для входа в систему файлы ресурсов, такие как .profile или .login будут считаны оболочкой. Если команда указана, она передается оболочке для выполнения. Иначе интерактивная оболочка выполняется. sudo пытается измениться на корневой каталог того пользователя прежде, чем выполнить оболочку. Это также инициализирует среду, оставляя без изменений ДИСПЛЕЙ и ТЕРМИН, установку HOME, ПОЧТУ, SHELL, ПОЛЬЗОВАТЕЛЯ, LOGNAME, и ПУТЬ, а также содержание/etc/environment в системах AIX и Linux. Все другие переменные среды удалены.
Можно корректироваться sudo
env_keep
параметр для включения PATH
, хотя необходимо иметь в виду последствия безопасности выполнения этого.
visudo
... запустит Ваш $EDITOR
, затем можно внести изменения в Defaults env_keep =
...по обстоятельствам.
Кроме того, можно добавить/usr/local/bin к пути системы путем добавления файлов к /etc/profile.d
.
например:
cat <<EOF > /etc/profile.d/tjameson.sh
export PATH=$PATH:/usr/local/bin
EOF
sudo
имеет специальную обработку PATH
таким образом, Вы не должны делать этого.
– Arrowmaster
05.07.2011, 20:47
secure_path
опция. Значение по умолчанию не включало/usr/local/bin
на моей установке. Спасибо, это действительно помогло ясному материалу встать! – beatgammit 09.07.2011, 08:29