Перенаправити stderr на змінну без налагодження


-1

Я хочу зберегти stderr цієї команди до змінної.

printf "1\r" > /dev/cu.usbserial

Stderr є -bash: /dev/cu.usbserial: Permission denied. Добре.

Але коли я запускаю це у скрипті bash, змінна додає ім'я сценарію та номер рядка. Як я можу зупинити це, і щоб він показав лише помилку? Я не хочу розбирати його за допомогою sed і т.д.

var="$(printf "1\r" 2>&1 > /dev/cu.usbserial)"

$var зараз:

/Users/elliott/Dropbox/scripts/switch1.sh: line 4: /dev/cu.usbserial: Permission denied

На всіх варіантах, які я спробував, лінія надрукована stderr для вашого першого прикладу bash: /dev/cu.usbserial: Permission denied. Ви в порядку з bash: або ви знайшли спосіб уникнути цього?
rici

Ой, моя помилка. Я не знайшов способу цього уникнути, але хотів би.
Elliott B

Простий тест: [[ ! -w /dev/cu.usbserial ]] && echo "file is not writable by you"
Cyrus

Відповіді:


0

Я не можу зрозуміти, як отримати оболонку це тлумачить сценарій, щоб "забути", що він робить це, або для припинення діагностичної інформації, пов'язаної з скриптом повідомлення про помилки. Проте, поки цей контекст інформація зберігається через вилки (у підгрупи), вона не передається через execs (до новий процеси оболонки). Отже, за рахунок вилки / виведення нового процесу оболонки, ви можете це зробити

var=$(sh -c 'printf "1\r" > /dev/cu.usbserial' 2>&1)

який встановлює $var до

sh: /dev/cu.usbserial: Permission denied

Особливість sh -c що іноді бентежить людей (особливо коли вони використовують його в find … -exec sh -c "…" {} ";" ) це додаткові аргументи командного рядка (після -c і команда для запуску нової оболонки) приймаються як параметри командного рядка для нової оболонки, починаючи з $0. І $0 розглядається як назва оболонки / сценарію, який згодом використовується новою оболонкою для префіксації повідомлень про помилки. Тому,

sh -c 'echo "Mellow rhymes with $2, but nothing rhymes with $1."; printf "1\r" > /dev/cu.usbserial' \
                                    red orange yellow

(розбито на дві лінії виключно для читання)

Mellow rhymes with yellow, but nothing rhymes with orange.
red: /dev/cu.usbserial: Permission denied

Отже, якщо ви готові вдатися до kludgy hack, щоб отримати значення змінної почати з чогось іншого, ніж sh: або bash:, використовуйте

var=$(sh -c 'printf "1\r" > /dev/cu.usbserial' error 2>&1)

який встановлює $var до

error: /dev/cu.usbserial: Permission denied

(зробивши, що оболонка це думає його назва є error ).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.