Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Сценарий, который работает каждый час для переквалификации моих спам-фильтров, основывал две папки IMAP, куда промежуток и ветчина помещаются.
#!/bin/sh
FNDIR="train-as-spam"
FPDIR="train-as-ham"
for dir in /home/*/.maildir
do
cd "${dir}"
USER=`stat -c %U .`
SRCDIR="${dir}/.${FNDIR}"
if [ ! -d ${SRCDIR} ]; then
echo no "${SRCDIR}" directory
else
cd "${SRCDIR}/cur"
ls -tr | while read file
do
if grep -q "^X-DSPAM" "${file}"; then
SOURCE="error"
else
SOURCE="corpus"
fi
dspam --user "${USER}" --class=spam --source="${SOURCE}" --deliver=innocent,spam --stdout < "${file}" > "../tmp/${file}"
mv "../tmp/${file}" "${dir}/new/${file%%:*}" && rm "${file}"
done
fi
SRCDIR="${dir}/.${FPDIR}"
if [ ! -d ${SRCDIR} ]; then
echo no "${SRCDIR}" directory
else
cd "${SRCDIR}/cur"
ls -tr | while read file
do
if grep -q "^X-DSPAM" "${file}"; then
SOURCE="error"
else
SOURCE="corpus"
fi
dspam --user "${USER}" --class=innocent --source="${SOURCE}" --deliver=innocent,spam --stdout < "${file}" > "../tmp/${file}"
mv "../tmp/${file}" "${dir}/new/${file%%:*}" && rm "${file}"
done
fi
done
Сценарий VBS для создания YYYY/YYYY-MM/YYYY-MM-DD файловой структуры в моей фото папке и фотографиях перемещения от моей камеры до соответствующей папки.
Я получил сценарий, который извлекает теги id3, кодирует песни недавно в определенном формате и затем добавляет их согласно тегам к моей музыкальной библиотеке.
300 строк Python. Главным образом, потому что Ламе не может иметь дело с тегами хорошим способом.
Я записал простое приложение VB, которое отследило, какие игровые числа Freecell я играл и успешно завершил и всегда запускал его с другим семенем.
.... запуск от 1....
игровое число Max является 65k. Скорее печально больше чем после 5 лет я нахожусь все еще только в сотнях. Но по крайней мере я знаю, что никогда не играл ту же руку дважды!
** Постскриптум - это только приложение VB, которое я когда-либо писал. Я выполнил крик назад к C++....
Резервное копирование MySQL. Я сделал сценарий пакетной обработки Windows, который создаст возрастающие резервные копии баз данных MySQL, создавать новый дамп каждый день и создавать резервную копию их каждые 10 минут на удаленном сервере. Это сохранило мою задницу бесчисленные времена, особенно в бесчисленных ситуациях, где клиент будет звонить, вопя их голова от этого, запись просто "исчезла" из базы данных. Я не пошел "без проблем, давайте посмотрим то, что произошло", потому что я также записал сценарий двоичного поиска, который будет искать прошлый момент, когда запись присутствовала в базе данных. Оттуда было бы довольно легко понять, кто "украл" его и почему.
Вы не вообразили бы, насколько полезный они были, и я использовал их в течение почти 5 лет. Я не переключился бы ни на что больше просто, потому что они были примерно протестированы, и они изготовлены на заказ, означая, что они делают точно, в чем я нуждаюсь и ничто больше, но я настроил их так, что это был бы снимок для добавления дополнительной функциональности.
Так, мой "шедевр" является инкрементным резервным копированием MySQL + удаленное резервное копирование + система поиска журналов для Windows. Я также записал версию для Linux, но я потерял его где-нибудь, вероятно, потому что это были только приблизительно 15 строк + задание крона вместо приблизительно 1 200 строк Windows + две запланированных задачи.
У меня есть пакетный файл, который устанавливает соединение VPN и затем вводит бесконечный цикл, проверяя с помощью ping-запросов машину с другой стороны соединения каждые пять минут так, чтобы сервер VPN не отбрасывал соединение из-за неактивности, если я не генерирую трафика по тому соединению некоторое время.
Я часто использую макрос MS Word, который берет файл исходного кода, форматирует его в двух столбцах моноширинного типа на альбомной странице, нумерует строки и добавляет заголовок компании и информацию о нижнем колонтитуле, такую как имя файла, дата печати, номер страницы и оператор конфиденциальности.
Печать обеих сторон страницы использует о 1/4 бумагу как эквивалент lpr
команда. (Кто-либо использует lpr
еще???)
Лучший реальный сценарий?
Я: (Вводит комнату) "Босс, я хочу повышение".
Босс: (Стул предложений из-за стола) "Повышение? Устройтесь на мою работу!"
С другой стороны, который может быть хуже сценарий!
alias snoot='find . ! -path "*/.svn*" -print0 | xargs -0 egrep '
Аниме контрольная сумма CRC32:
#!/usr/bin/python
import sys, re, zlib
c_null="^[[00;00m"
c_red="^[[31;01m"
c_green="^[[32;01m"
def crc_checksum(filename):
filedata = open(filename, "rb").read()
sum = zlib.crc32(filedata)
if sum < 0:
sum &= 16**8-1
return "%.8X" %(sum)
for file in sys.argv[1:]:
sum = crc_checksum(file)
try:
dest_sum = re.split('[\[\]]', file)[-2]
if sum == dest_sum:
c_in = c_green
else:
c_in = c_red
sfile = file.split(dest_sum)
print "%s%s%s %s%s%s%s%s" % (c_in, sum, c_null, sfile[0], c_in, dest_sum, c_null, sfile[1])
except IndexError:
print "%s %s" %(sum, file)
Сценарий Python, который делает filewalk и печатает мое дерево каталогов, отсортированное по использованию диска.
Я записал маленький сценарий оболочки, tapt, поскольку Debian основывал систему. особенно Ubuntu. То, что это в основном делает, должно отправить всю Вашу "Кв. - получают" операции к Вашему аккаунту в Твиттере. Это помогает мне отслеживать то, что и когда я установил/удалил программы в своей системе Ubuntu. Я создал новый аккаунт в Твиттере только для этого и сохранил его частным. Действительно полезный. Больше информации здесь: http://www.quicktweaks.com/tapt/
Хорошо назад в 2005 я использовал хинду Linux, и я использовал много небольшая программа, названная genlop, чтобы показать мне историю того, что я появился (установленный) на моем хинду поле. Хорошо для упрощения моей работы я записал не маленький сценарий Python, а большой, но в то время я только что начал использовать Python:
#!/usr/bin/python
##############################################
# Gentoo emerge status #
# This script requires genlop, #
# you can install it using `emerge genlop`. #
# Milot Shala <milot@mymyah.com> #
##############################################
import sys
import os
import time
#colors
color={}
color["r"]="\x1b[31;01m"
color["g"]="\x1b[32;01m"
color["b"]="\x1b[34;01m"
color["0"]="\x1b[0m"
def r(txt):
return color["r"]+txt+color["0"]
def g(txt):
return color["g"]+txt+color["0"]
def b(txt):
return color["b"]+txt+color["0"]
# View Options
def view_opt():
print
print
print g("full-info - View full information for emerged package")
print g("cur - View current emerge")
print g("hist - View history of emerged packages by day")
print g("hist-all - View full list of history of emerged packages")
print g("rsync - View rsync history")
print g("time - View time for compiling a package")
print g("time-unmerged - View time of unmerged packages")
print
command = raw_input(r("Press Enter to return to main "))
if command == '':
c()
program()
else:
c()
program()
# system command 'clear'
def c():
os.system('clear')
# Base program
def program():
c()
print g("Gentoo emerge status script")
print ("---------------------------")
print
print ("1]") + g(" Enter options")
print ("2]") + g(" View options")
print ("3]") + g(" Exit")
print
command = input("[]> ")
if command == 1:
print
print r("""First of all you must view options to know what to use, you can enter option name ( if you know any ) or type `view-opt` to view options.""")
print
time.sleep(2)
command = raw_input(b("Option name: "))
if (command == 'view-opt' or command == 'VIEW-OPT'):
view_opt()
elif command == 'full-info':
c()
print g("Full information for a single package")
print ("-------------------------------------")
print
print b("Enter package name")
command=raw_input("> ")
c()
print g("Full information for package"), b(command)
print ("-----------------------------------")
print
pack=['genlop -i '+command]
pack_=" ".join(pack)
os.system(pack_)
print
print r("Press Enter to return to main.")
command=raw_input()
if command == '':
c()
program()
else:
c()
program()
elif command == 'cur':
if command == 'cur':
c()
print g("Current emerge session(s)")
print ("-------------------------")
print
print b("Listing current emerge session(s)")
print
time.sleep(1)
os.system('genlop -c')
print
print r("Press Enter to return to main.")
command = raw_input()
if (command == ''):
c()
program()
else:
c()
program()
elif command == 'hist':
if command == 'hist':
c()
print g("History of merged packages")
print ("---------------------------")
print
time.sleep(1)
print b("Enter number of how many days ago you want to see the packages")
command = raw_input("> ")
c()
print g("Packages merged "+b(command)+ g(" day(s) before"))
print ("------------------------------------")
pkg=['genlop --list --date '+command+' days ago']
pkg_=" ".join(pkg)
os.system(pkg_)
print
print r("Press Enter to return to main.")
command = raw_input()
if command == '':
c()
program()
else:
c()
program()
elif command == 'hist-all':
c()
print g("Full history of merged individual packages")
print ("--------------------------------------")
print
print b("Do you want to view individual package?")
print r("YES/NO?")
command = raw_input("> ")
print
if (command == 'yes' or command == 'YES'):
print g("Enter package name")
command = raw_input("> ")
print
pkg=['genlop -l | grep '+command+ ' | less']
pkg_=" ".join(pkg)
os.system(pkg_)
print
print r("Press Enter to return to main")
command = raw_input()
if command == '':
c()
program()
else:
c()
program()
elif (command == 'no' or command == 'NO'):
pkg=['genlop -l | less']
pkg_=" ".join(pkg)
os.system(pkg_)
print
print r("Press Enter to return to main")
command = raw_input()
if command == '':
c()
program()
else:
c()
program()
else:
c()
program()
elif command == 'rsync':
print g("RSYNC updates")
print
print
print
print b("You can view rsynced time by year!")
print r("Do you want this script to do it for you? (yes/no)")
command = raw_input("> ")
if (command == 'yes' or command == 'YES'):
print
print g("Enter year i.e"), b("2005")
print
command = raw_input("> ")
rsync=['genlop -r | grep '+command+' | less']
rsync_=" ".join(rsync)
os.system(rsync_)
print
print r("Press Enter to return to main.")
c()
program()
elif (command == 'no' or command == 'NO'):
os.system('genlop -r | less')
print
print r("Press Enter to return to main.")
command = raw_input()
if command == '':
c()
program()
else:
c()
program()
elif command == 'time':
c()
print g("Time of package compilation")
print ("---------------------------")
print
print
print b("Enter package name")
pkg_name = raw_input("> ")
pkg=['emerge '+pkg_name+' -p | genlop -p | less']
pkg_=" ".join(pkg)
os.system(pkg_)
print
print r("Press Enter to return to main")
time.sleep(2)
command = raw_input()
if command == '':
c()
program()
else:
c()
program()
elif command == 'time-unmerged':
c()
print g("Show when package(s) is/when is unmerged")
print ("----------------------------------------")
print
print b("Enter package name: ")
name = raw_input("> ")
pkg=['genlop -u '+name]
pkg_=" ".join(pkg)
os.system(pkg_)
print
print r("Press Enter to return to main")
time.sleep(2)
command = raw_input()
if command == '':
c()
program()
else:
c()
program()
else:
print
print r("Wrong Selection!")
time.sleep(2)
c()
program()
elif command == 2:
view_opt()
command = raw_input(r("Press Enter to return to main "))
if command == '':
c()
program()
else:
c()
program()
elif command == 3:
print
print b("Thank you for using this script")
print
time.sleep(1)
sys.exit()
else:
print
print r("Wrong Selection!")
time.sleep(2)
c()
program()
command = ("")
program()
Как запланированная задача, для копирования любых измененных/новых файлов со всего диска d: к резервному диску g: и зарегистрировать скопированные файлы. Это помогает мне отслеживать то, что я сделал когда, также.
justdate является небольшой программой к печати дата и время на экран
g:
cd \drive_d
d:
CD \
тип g:\backup_d.log>> g:\logs\backup_d.log
эхо ==========================================> g:\backup_d.log
d:\mu\bmutil\justdate>> g:\backup_d.log
/s/d/y/c xcopy. g:\drive_d>> g:\backup_d.log
Я использую DOS-программу, что ошибки, если она проходит определенную дату. Я просто посмотрел на пакетный файл, который это использовало для запуска и изменило его так, это сначала изменит дату на 2000, затем запустит программу. На выходе программы это изменило дату назад назад на то, чем это было, прежде чем это было изменено.
#!/usr/bin/perl
use strict;
use utf8;
use Encode;
use File::Find;
binmode STDOUT, ':utf8';
sub orderly {
my ($x, $y) = @_{$a, $b};
if (my $z = $x <=> $y) {return $z}
$x = length $a;
$y = length $b;
my $z = $x < $y ? $x : $y;
if (substr($a, 0, $z) eq substr($b, 0, $z)) {
return $y <=> $x;
}
else {
return $a cmp $b;
}
}
my %conf = map +($_ => 0), split //, 'acsxL';
sub Stat {$conf{L} ? lstat : stat}
my @dirs = ();
while (defined ($_ = shift)) {
if ($_ eq "--") {push @dirs, @ARGV; last}
elsif (/^-(.*)$/s) {
for (split //, $1) {
if (!exists $conf{$_} or $conf{$_} = 1 and $conf{a} and $conf{s}) {
print STDERR "$0 [-a] [-c] [-s] [-x] [-L] [--] ...\n";
exit 1;
}
}
}
else {push @dirs, $_}
}
s/\/*$//s for @dirs; # */ SO has crappy syntax highlighting
@dirs = qw(.) unless @dirs;
my %spec = (follow => $conf{L}, no_chdir => 1);
if ($conf{a}) {
$spec{wanted} = sub {
Stat;
my $s = -f _ ? -s _ : 0;
decode(utf8 => $File::Find::name) =~ /^\Q$dirs[0]\E\/?(.*)$/s;
my @a = split /\//, $1;
for (unshift @a, $dirs[0]; @a; pop @a) {
$_{join "/", @a} += $s;
}
};
}
elsif ($conf{s}) {
$spec{wanted} = sub {
Stat;
$_{$dirs[0]} += -f _ ? -s _ : 0;
};
}
else {
$spec{wanted} = sub {
Stat;
my $s = -f _ ? -s _ : 0;
decode(utf8 => $File::Find::name) =~ /^\Q$dirs[0]\E\/?(.*)$/s;
my @a = split /\//, $1;
! -d _ and pop @a;
for (unshift @a, $dirs[0]; @a; pop @a) {
$_{join "/", @a} += $s;
}
};
}
if ($conf{x}) {
$spec{preprocess} = sub {
my $dev = (Stat $File::Find::dir)[0];
grep {$dev == (Stat "$File::Find::dir/$_")[0]} @_;
};
}
while (@dirs) {
find(\%spec, $dirs[0] eq "" ? "/" : $dirs[0]);
$_{""} += $_{$dirs[0]} if $conf{c};
shift @dirs;
}
$_{$_} < 1024 ** 1 ? printf "%s «%-6.6sB» %s\n", $_{$_}, sprintf("%6.6f", "$_{$_}" / 1024 ** 0), $_ :
$_{$_} < 1024 ** 2 ? printf "%s «%-6.6sK» %s\n", $_{$_}, sprintf("%6.6f", "$_{$_}" / 1024 ** 1), $_ :
$_{$_} < 1024 ** 3 ? printf "%s «%-6.6sM» %s\n", $_{$_}, sprintf("%6.6f", "$_{$_}" / 1024 ** 2), $_ :
$_{$_} < 1024 ** 4 ? printf "%s «%-6.6sG» %s\n", $_{$_}, sprintf("%6.6f", "$_{$_}" / 1024 ** 3), $_ :
$_{$_} < 1024 ** 5 ? printf "%s «%-6.6sT» %s\n", $_{$_}, sprintf("%6.6f", "$_{$_}" / 1024 ** 4), $_ :
$_{$_} < 1024 ** 6 ? printf "%s «%-6.6sP» %s\n", $_{$_}, sprintf("%6.6f", "$_{$_}" / 1024 ** 5), $_ :
$_{$_} < 1024 ** 7 ? printf "%s «%-6.6sE» %s\n", $_{$_}, sprintf("%6.6f", "$_{$_}" / 1024 ** 6), $_ :
$_{$_} < 1024 ** 8 ? printf "%s «%-6.6sZ» %s\n", $_{$_}, sprintf("%6.6f", "$_{$_}" / 1024 ** 7), $_ :
printf "%s «%-6.6sY» %s\n", $_{$_}, sprintf("%6.6f", "$_{$_}" / 1024 ** 8), $_
for grep {$_{$_} > 0} sort orderly keys %_;
Я сохраняю его в ~/bin/dush
, это действует как своего рода du -h
/du | sort -n
гибрид: виды и дают человекочитаемые размеры внезапно. Очень полезный для нахождения, что поднимает дисковое пространство.
В том же духе,
#!/usr/bin/perl
$t = 1;
%p = map {$_ => ($t *= 1024)} qw(K M G T P E Z Y);
$t = 4707319808;
if (@ARGV) {
if (($_ = shift) =~ /^-*dvd/i) {$t = 4707319808}
elsif (/^-*cd[^w]*$/i) {$t = 737280000}
elsif (/^-*cd/i) {$t = 681984000}
elsif (/^-*([\d.]+)([kmgtpezy])/i) {$t = $1 * ($p{"\U$2"} || 1)}
elsif (/^-*([\d.]+)/) {$t = $1}
else {unshift @ARGV, $_}
}
($q, $r, $s) = (0, ($ENV{COLUMNS} || 80) - 13, $t);
while (<>) {
chomp, stat;
unless (-e _) {
print STDERR "$_ does not exist\n";
next;
}
if (($s += -s _) > $t) {
$s && $s < $t && printf "-%7s %s\n",
sprintf("%2.3f%%", 100 * ($t - $s) / $t), $t - $s;
printf "-----------%d%*s\n", ++$q, $r, "-" x $r;
$s = -s _;
}
printf "%8s %s\n",
sprintf("%3.3f%%", $s * 100 / $t),
/.{4}(.{$r})$/s ? "...$1" : $_;
}
$s && $s < $t && printf "-%7s %s\n",
sprintf("%2.3f%%", 100 * ($t - $s) / $t), $t - $s;
Я сохраняю это как ~/bin/fit
. Когда я архивирую набор файлов, я работаю ls | fit
или ls | fit -cdrw
помочь определить, будет ли это соответствовать на DVD/CD/CDRW, и где разделить их, если они не делают.
Подобный backup.sh для каждого проекта, что смолы и gzips просто источник, перемещает его в каталог снимка и маркирует его меткой времени: project-mmddyy-hhmmss. Полезный для кодирования между фиксациями.
Названный assignIisSite_ToAppPool.js
, Действительно полезный, когда Вы хотите удостовериться, что некоторые ресурсы правильно отображаются.
:)
SetAppPool("W3SVC/1059997624/Root", "MyAppPool");
function SetAppPool(webId, appPoolName)
{
var providerObj=GetObject("winmgmts:/root/MicrosoftIISv2");
var vdirObj=providerObj.get("IIsWebVirtualDirSetting='" + webId + "'");
vdirObj.AppPoolId=appPoolName;
vdirObj.Put_();
}
У меня был сценарий управления версиями, который возьмет каталог в качестве аргумента и рекурсивно скопирует все файлы в../dirname/DATE/TIME /
, Очевидно, это был дрянной способ сделать вещи, но это было удобно прежде, чем установить реальный пакет управления версиями.
Я записал, что некоторые строки кода для автоматической тонкой настройки всех вещей powertop предлагают, когда я отключаю свой ноутбук и отмену это, если я включаю ноутбук назад. Максимальная мощность, максимальная производительность, максимальное удобство.
Маленькая программа панели задач, которая извлекла каждый код ошибки, постоянный из стороннего JavaDoc, и позволила мне поиск постоянное имя данного кода ошибки. Плюс, добавьте в любых преобразованиях от ШЕСТНАДЦАТЕРИЧНОГО ЧИСЛА к десятичному числу, и т.д.
Это подходит много при работе в отладчике - Вы возвращаете код ошибки, но затем отслеживающий назад код для отправки текстовых сообщений огромная боль. Это еще более распространено при работе с программным обеспечением, которое переносит собственные методы, вызовы ОС или COM... часто времена, константы копируются прямо из ошибочного заголовочного файла без дополнительного контекста, повторных значений и никаких перечислений.
Я предполагаю, что это зависит от того, как Вы определяете полезный, но мой любимый небольшой сценарий является вариантом на *, отклоняют fortune
программа. Посмотрите ниже, и Вы получите идею того, что она делает:
telemachus ~ $ haiku
January--
in other provinces,
plums blooming.
Issa
Это ничего действительно не сделало, но хороший хайку имеет большое значение. (Мне нравится, как colorizer решил интерпретировать стихотворение.) ( Редактирование : Если бы я действительно должен быть полезным, я сказал бы, что сценарий, который позволяет пользователю вводить американский индекс и получать текущую погоду и 0-3 дня прогноза от Google.)
Я записал задание крона для захвата IP-адреса моего маршрутизатора пап и ftp это к безопасному месту поэтому, когда он нуждался в помощи, я мог удаленный рабочий стол в и фиксировать его аккомпанемент
Просто сценарий Python, который преобразовывает окончания строки от Unix до Windows, что я всунул свой system32 каталог. Это терялось возрастам в течение нескольких месяцев, теперь, но в основном это преобразует список известных основанных на тексте типов файлов к окончаниям строки Windows, и Вы могли указать, который перечисляют файлы преобразовать, или все файлы, для подстановочного знака.
Rakefile в моем каталоге загрузок, содержащем задачи, которые копируют файлы от упомянутого каталога до их соответствующих архивов медиа на внешних дисках. Учитывая мою интернет-скорость и емкость хранения, мне потребовались бы часы из каждой недели, чтобы просто скопировать через и переименовать соответственно каждую часть медиа, которая загружается (полностью по закону, я мог бы добавить) hellanzb.
Другая очень полезная задача в том же файле входит и очищает IMDb для списков эпизода / дискографии всех медиа, которые я имею, и затем проверяет NewzBin на отчеты, которые заполнили бы любые дыры, которые я имею.
Объединенный, это означает, что я абсолютно ничего не должен делать, и в обмен, я просыпаюсь каждое утро с большим количеством медиа, чем я мог возможно использовать в тот день, сидя на моих внешних жестких дисках.
я упоминал, что это все совершенно честно и законно? d-:
я, вероятно, объединю это все в своего рода менеджера/плеер медиа командной строки (сдающий вещи в аренду к mplayer) и опубликую его на GitHub, когда у меня будет время.
Не каждое 110-дневное, но я действительно использовал сценарий XSLT для создания моих свадебных приглашений (файл Страниц для вставок к пригласить картам и файл HTML для адресных ярлыков).
Я записал сценарий для форматирования C исходные файлы, который автоматически форматирует код с помощью соответствующей комбинации символов табуляции и пробелов, таких, что файл будет казаться корректным независимо от того, какова установка позиции табуляции на редакторе.
Исходный код здесь .
Самое полезное? Но существуют так многие...
ts.cmd содержит следующее, которое позволяет мне правильно соединяться с консольной сессией другой машины по RDP независимо от того, являюсь ли я на Vista SP1 или нет.
@echo прочь
ver | находят "6.0.6001"
, если ERRORLEVEL 0, если не errorlevel 1 (устанавливает TSCONS=admin), ЕЩЕ команда выдача эха TSCONS=console
набора: mstsc / %TSCONS %/v %1
запускают mstsc / %TSCONS %/v %1
(Извините за странное форматирование, по-видимому, у Вас не может быть больше чем одного примера кода на ответ?)
От командной строки я перейду туда, где мой файл решения VS, и затем я захочу открыть его, но я слишком ленив, чтобы ввести blah.sln и нажать Enter. Таким образом, я записал sln.cmd:
@echo off
if not exist *.sln goto csproj
for %%f in (*.sln) do start /max %%f
goto end
:csproj
for %%f in (*.csproj) do start /max %%f
goto end
:end
, Таким образом, я просто ввожу sln и нажимаю Enter, и он открывает файл решения, если таковые имеются, в текущем каталоге. Я переношу вещи как pushd и popd в pd.cmd и pop.cmd.
Я использую procmail для сортировки моей входящей электронной почты к различным папкам. Поскольку я испытываю затруднения при запоминании procmailrc синтаксиса, я использую m4 в качестве препроцессора. Вот то, как мой procmailrc начинается (это еще не сценарий):
divert(-1)
changequote(<<, >>)
define(mailinglistrule,
<<:0:
* $2
Lists/$1
>>)
define(listdt, <<mailinglistrule($1,^Delivered-To:.*$2)>>)
define(listid, <<mailinglistrule($1,^List-Id:.*<$2>)>>)
divert# Generated from .procmailrc.m4 -- DO NOT EDIT
Это определяет два макросов для списков рассылки, таким образом, например, listdt (нечто, foo@example.com) расширяется до
:0:
* ^Delivered-To:.*foo@example.com
Lists/foo
подразумевать, что электронные письма с Поставленным - К заголовку, содержащему foo@example.com, должны быть помещены в папку Lists/foo. Это также располагает обработанный файл для начала с комментария, который попросил меня не отредактировать тот файл непосредственно.
Теперь, откровенно говоря, m4 пугает меня: что, если я случайно переопределяю макрос и procmail, начинает отбрасывать всю мою электронную почту или что-то как этот? Вот почему у меня есть сценарий, который я называю обновлением-procmailrc, которое показывает мне в различном формате, как мой procmailrc собирается измениться. Если изменение является всего несколькими строками и взглядами примерно как то, что я предназначил, я могу счастливо утвердить его, но если существуют огромные изменения в файле, я знаю для рассмотрения моих редактирований более тщательно.
#! /bin/sh
PROCMAILRC=.procmailrc
TMPNAM=.procmailrc.tmp.$
cd $HOME
umask 077
trap "rm -f $TMPNAM" 0
m4 < .procmailrc.m4 > $TMPNAM
diff -u $PROCMAILRC $TMPNAM
echo -n 'Is this acceptable? (y/N) '
read accept
if [ -z "$accept" ]; then
accept=n
fi
if [ $accept = 'y' -o $accept = 'Y' ]; then
mv -f $TMPNAM $PROCMAILRC && \
chmod 400 $PROCMAILRC && \
echo "Created new $PROCMAILRC"
if [ "$?" -ne 0 ]; then
echo "*** FAILED creating $PROCMAILRC"
fi
else
echo "Didn't update $PROCMAILRC"
fi
сценарий еще не предотвратил почтовых аварий, но он сделал меня менее беспокоящимся об изменении моего procmailrc.
Сценарий, который читает файл конфигурации в текущем dir, входит в учетную запись FTP и загружает все файлы, которые изменились с прошлого раза это было выполнено. Действительно удобный для клиентов, которые используют общий хостинг, и FTP является моей единственной опцией для доступа к файлу.