Вход оболочки всегда является путем к исполняемому файлу; или абсолютный или относительный. Это должно состоять из пути к каталогу/имени файла. Если Вы только укажете имя исполняемого файла в своем текущем каталоге, то оболочка автоматически снабдит префиксом ту строку, которую Вы вводите с каждым из каталогов в $PATH
. Именно поэтому всегда необходимо вводить путь.
BTW, если Ваш код находится в /home/uname/code/
и Вы находитесь в /home/uname/
, необходимо не обязательно использовать
./code/a.outможно также просто использовать
code/a.outпотому что это - также относительный путь.
Это типичная работа для tr
:
LC_ALL=C tr '\0-\10\13\14\16-\37' '[ *]' < in > out
В вашем случае она не работает с sed
, потому что вы находитесь в регионе, где эти диапазоны не соответствуют смысл. Если вы хотите работать со значениями байтов, а не с символами, и где порядок основан на числовом значении этих байтов, лучше всего использовать локаль C . Ваш код работал бы с LC_ALL = C
с GNU sed
, но использование sed
(не говоря уже о perl
) здесь немного излишне (и те \ xXX
не переносимы между реализациями sed
, в то время как этот подход tr
является POSIX).
Вы также можете доверять представлению вашего региона о том, с какими печатными символами относятся:
tr -c '[:print:]\t\r\n' '[ *]'
Но с GNU tr
(как обычно в системах на базе Linux) это работает только в языковых стандартах, где символы являются однобайтовыми (обычно это не UTF-8).
В языковом стандарте C это также исключает DEL (0x7f) и все вышеперечисленные байтовые значения (не в ASCII).
В локали UTF-8 вы можете использовать GNU sed
, в котором нет проблемы GNU tr
имеет:
sed 's/[^[:print:]\r\t]/ /g' < in > out
(обратите внимание, что те \ r
, \ t
не являются стандартными, и GNU sed
не распознает их, если POSIXLY_CORRECT
находится в среде (будет рассматривать их как обратную косую черту, r и t входит в набор, как того требует POSIX)).
Он не будет преобразовывать байты, которые не образуют допустимые символы, если таковые имеются.
Я пытался отправить уведомление через libnotify с содержимым, которое может содержать непечатаемые символы. Существующие решения не совсем работали для меня (с использованием белого списка символов с использованием tr
работает, но удаляет любые многобайтовые -символы ).
Вот что сработало при прохождении теста:
message=$(iconv --from-code=UTF-8 -c <<< "$message")