Вторая попытка не вызывает ошибки, но это не так. не работает нормально, если вы пытаетесь проверить, содержит ли файл хотя бы одну строку.
Вывод команды wc -l "/disk1/environment.sh"
состоит из количества строк в файле, пробела и имени файла. Если вы хотите использовать количество строк, вам нужно его извлечь. Вместо разделения вывода существует более простой способ: вместо передачи имени файла в командной строке перенаправить вывод wc
из файла. Затем wc
печатает только номер без имени файла.
if [[ $(wc -l <"/disk1/environment.sh") -ge 0 ]];then
echo "File has data"
fi
Или, поскольку вы все равно используете синтаксис bash,
if (($(wc -l <"/disk1/environment.sh") >= 0)); then
echo "File has data"
fi
Конечно, это всегда верно, поскольку количество строк всегда больше или равно 0. Но вы можете получить полезные результаты с другими числами.
В первой попытке вы используете оператор -ge
. Это оператор над целыми числами. Вы получаете сообщение об ошибке, потому что левая часть не целое число, а что-то вроде 42 /disk1/environment.sh
.
Во второй попытке вы используете оператор <
в условном операторе. Это оператор сравнения строк (в лексическом порядке). Так получилось, что вывод wc -l /disk1/environment.sh
всегда лексически упорядочен после 0
, так как он начинается с цифры, поэтому [[$ ( wc -l <"/ disk1 / environment.sh")> 0]]
всегда верно. Исключение составляют случаи, когда /disk1/environment.sh
не существует; в этом случае wc -l
ничего не выводит на стандартный вывод (вместо этого записывает сообщение об ошибке в стандартную ошибку), и сравнение неверно.
Сравнение количества строк в файле с 0 не очень полезно. В современных системах wc -l
подсчитывает количество символов новой строки. В текстовом файле количество символов новой строки равно 0, только если файл пуст. (Обычно wc -l
возвращает 0, если файл не содержит символа новой строки; текстовый файл содержит новую строку в конце каждой строки, а количество новых строк в нетекстовых файлах редко полезная информация.) В условных выражениях есть оператор, проверяющий, пуст ли файл, вам не нужно вызывать wc
.
if [[ ! -e /disk1/environment.sh ]]; then
if [[ -L /disk1/environment.sh ]]; then
echo "/disk1/environment.sh is a broken symbolic link"
else
echo "/disk1/environment.sh does not exist"
fi
elif [[ ! -r /disk1/environment.sh ]]; then
echo "/disk1/environment.sh exists but is not readable"
elif [[ ! -s /disk1/environment.sh ]]; then
echo "/disk1/environment.sh is empty or is a special file (name pipe, etc.)"
else
echo "/disk1/environment.sh is not empty"
fi
Исправлено!
Решение: с помощью модуля alsa_out
.
Чтобы использовать их, вы запускаете JACK как обычно. Затем вы запускаете экземпляр
alsa_in
илиalsa_out
для каждого дополнительного устройства (и «направления»), которое вы хотите использовать.alsa_out
создаст набор портов, представляющих возможности воспроизведения устройства, аalsa_in
будет представлять возможности захвата / записи
Итак:
arecord --list-devices
, чтобы найти имя встроенной звуковой карты (hw: 0,0) alsa_out -d hw: 0,0
для создания портов alsa_out, которые теперь отображаются в разъеме порт alsa_out
в разъеме JACK - теперь воспроизводит метроном через разъем для наушников и любой другой звук, который требуется от звуковой карты USB!