Alternate example for @lesmana solution, possibly simplified.
Provides logging to file if desired.
=====
$ cat z.sh
TEE="cat"
#TEE="tee z.log"
#TEE="tee -a z.log"
exec 8>&- 9>&-
{
{
{
{ #BEGIN - add code below this line and before #END
./zz.sh
echo ${?} 1>&8 # use exactly 1x prior to #END
#END
} 2>&1 | ${TEE} 1>&9
} 8>&1
} | exit $(read; printf "${REPLY}")
} 9>&1
exit ${?}
$ cat zz.sh
echo "my script code..."
exit 42
$ ./z.sh; echo "status=${?}"
my script code...
status=42
$
у вас есть файл с именем o
в текущем каталоге
foo> ls
foo> echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z]
1234567890
foo> touch o
foo> echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z]
abcdefghijklmnpqrstuvwxyz1234567890
Оболочка расширит строку [a-z]
, если будет найдено совпадение.
Согласноman bash
Pathname Expansion
After word splitting, unless the -f option has been set, bash scans each word for the characters *, ?, and [.... (...)
bash выполнит расширение.
[...] Matches any one of the enclosed characters.
Оболочка (bash )видит аргумент [a-z]
. Это подстановочный знак (a glob ), который соответствует любой строчной букве¹. Поэтому оболочка ищет имя файла, соответствующее этому шаблону. Есть три случая:
tr
видит аргументы -d
и [a-z]
. Это то, что происходит на большинстве ваших машин. tr
видит аргументы -d
и имя файла. Это происходит на сервере, и соответствующий файл называется o
, так как мы видим, что tr
удалил букву o
. tr
видит три или более аргументов:-d
и имена файлов. Так как tr
ожидает один аргумент после -d
, он будет жаловаться. Если в аргументе команды есть специальные символы, их необходимо экранировать. Поместите аргумент в одинарные кавычки'…'
(это самый простой способ, есть и другие ). Внутри одинарных кавычек все символы обозначают сами себя, кроме самой одинарной кавычки. Если внутри аргумента есть одинарная кавычка, замените ее на'\''
.
tr -d '[a-z]'
Однако заметьте, что это, вероятно, не то, что вы имели в виду! Это указывает tr
удалить строчные буквы и квадратные скобки. Это эквивалентно tr -d ']a-z['
, tr '[]a-z'
и т. д. Чтобы удалить строчные буквы, используйте
tr -d a-z
Аргументом tr
является набор символов.Вы заключаете в скобки набор символов в регулярном выражении или шаблоне подстановочных знаков, чтобы указать, что это набор символов. Но tr
работает с одним символом за раз. Его аргументы командной строки — это то, что вы поместили в скобки .
Скобки нужны для обозначения классов символов . В регулярном выражении вы используете скобки внутри скобок, чтобы указать класс символов, например. [[:lower:]]*
соответствует любому количеству строчных букв, [[:lower:]_]*
соответствует любому количеству строчных букв и знаков подчеркивания. В аргументе tr
вам нужен набор без окружающих скобок, поэтому tr -d '[:lower:]'
удаляет строчные буквы, tr -d '[:lower:]_'
удаляет строчные буквы и знаки подчеркивания и т. д.
¹В некоторых локалях он может соответствовать другим символам .