Використання вводу файлу як stdin для сценарію оболонки не працює


0

У мене є наступний код сценарію:

test.sh

echo "BEGIN"
while read CMD <&1; do
    [ -z "$CMD" ] && continue
    case "$CMD" in
    start)
            echo "get_start"
            ;;
    stop)
            echo "get_stop"
            ;;
    *)
            echo "get_uknown_command"
            ;;
    esac
    echo "END";
done

Коли я запускаю його з:

$./test.sh <input.txt

Я закриваю свій сценарій

input.txt

start
stop
sthh

Чому мій сценарій заблокований? Як я можу це виправити?

BTW: Якщо я введіть дані вручну, сценарій не заблокується.

Відповіді:


3

Ви використовуєте неправильний дескриптор файлу. 1є stdout, 0є stdin.

Змінити:

while read CMD <&1; do

до:

while read CMD <&0; do

І це буде з файлу правильно. Однак вам не потрібно робити це все, оскільки readза замовчуванням використовується stdin:

while read CMD; do

Також -uопцію можна використовувати для читання з конкретного дескриптора файлу (принаймні в bash). Тож ви можете це зробити також:

while read -u 0 CMD; do

2

Дескриптор файлу 1є stdoutабо стандартний висновок . Це означає, що ви переспрямовуєте readвхід із стандартного виводу . Це явно не буде працювати дуже добре; майже звичайно ніколи не буде жодного входу, який очікує на стандартний вихід для read.

Стандартний введення Дескриптор файлу 0, так що якщо ви зміните <&1в <&0рядку 2 вашого сценарію, він працює. Або просто повністю відкиньте цю частину; readзчитується зі стандартного вводу за замовчуванням (це в значній мірі його призначення), тому немає необхідності чітко говорити його для читання зі стандартного вводу.

Якщо ви хочете прочитати якийсь конкретний вклад в інтерактивному режимі і дозволити переадресацію решти з файлу (або пройти через трубу), ви можете зробити це read </dev/tty.

І вам не потрібен роздільник операцій з комою з комою після відлуння END; новий рядок справляється чудово.

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