Как программно выполнить возврат каретки в bash? - PullRequest
1 голос
/ 29 января 2020

Мой основной файл - главный. sh:

cd a_folder
echo "executing another script"
source anotherscript.sh
cd ..
#some other operations. 

другой сценарий. sh:

pause(){
   read -p "$*"
}
echo "enter a number: "
read number
#some operation
pause "Press enter to continue..."

Я хотел пропустить команду паузы. Но когда я делаю:

echo "/n" | source anotherscript.sh

Это не позволяет ввести номер. Я хочу, чтобы "/ n" происходило так, чтобы я позволял пользователю вводить число, но пропускал оператор паузы.

PS: не может вносить изменения в другой скрипт. sh. Все изменения должны быть сделаны в основном. sh.

Ответы [ 3 ]

0 голосов
/ 29 января 2020

Ваш подход не работает, потому что сценарий, который должен быть получен, требует две строки из stdin: сначала строка, содержащая число, затем пустая строка (которая выполняет паузу). Следовательно, вам нужно будет ввести в строку две строки: число и пустую строку. Если вы все еще хотите получить номер из своего собственного стандартного ввода, вы должны будете использовать команду read до:

echo "executing another script"
echo "enter a number: "
read number
printf "$number\n\n" | source anotherscript.sh

Но это все еще имеет некоторую опасность: исходная команда выполняется в подоболочке ; следовательно, любые изменения в среде, выполняемые anotherscript.sh, не будут видны в вашей оболочке.

Обходным решением было бы поместить логи чтения чисел c вне main. sh:

# This is script supermain.sh
echo "executing another script"
echo "enter a number: "
read number
printf "$number\n\n"|bash main.sh

где в main. sh, вы просто сохраняете ваш source anotherscript.sh без каких-либо труб.

0 голосов
/ 30 января 2020

Как комментирует пользователь 1934428, конвейер bash заставляет каскадные команды выполняться в подоболочках, а изменения переменных там не отражаются в текущем процессе.
Чтобы изменить это поведение, вы можете установить lastpipe с помощью shopt встроенный. Затем bash изменяет элемент управления заданием, чтобы последняя команда в конвейере выполнялась в текущей оболочке (как tsch).

Тогда попробуйте:

main_ sh

#!/bin/bash

shopt -s lastpipe               # this changes the job control
read -p "enter a number: " x    # ask for the number in main_sh instead
cd a_folder
echo "executing another script"
echo "$x" | source anotherscript.sh > /dev/null
                                # anotherscript.sh is executed in the current process
                                # unnecessary messages are redirected to /dev/null
cd ..
echo "you entered $number"      # check the result
#some other operations.

, который будет правильно печатать значение number.

В качестве альтернативы вы также можете сказать как:

#!/bin/bash

read -p "enter a number: " x
cd a_folder
echo "executing another script"
source anotherscript.sh <<< "$x" > /dev/null
cd ..
echo "you entered $number"
#some other operations.
0 голосов
/ 29 января 2020

Попробуйте

echo | source anotherscript.sh
...