Спасибо за ответы. Я тестировал разные вещи и пришел к следующему тестовому сценарию:
test.sh:
hist=`fc -nl -0`
# remove leading and trailing whitespaces
hist="$(echo "${hist}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
echo "Command line from history: '$hist'"
if [ -t 1 ]; then
echo "Direct output to TTY, no pipe involved."
else
echo "No TTY, maybe a piped command."
fi
if [ -p /dev/stdout ]; then
echo "stdout is a pipe."
else
echo "stdout is not a pipe."
fi
readlink -e /proc/self/fd/1
rst=$?
if [ $rst -eq 0 ]; then
echo "Readlink test status okay, no pipe involved."
else
echo "Readlink test status error $rst, maybe a piped command."
fi
Испытания:
$./test.sh test1
Command line from history: './test.sh test1'
Direct output to TTY, no pipe involved.
stdout is not a pipe.
/dev/pts/3
Readlink test status okay, no pipe involved.
$./test.sh test2 | cat
Command line from history: './test.sh test2 | cat'
No TTY, maybe a piped command.
stdout is a pipe.
Readlink test status error 1, maybe a piped command.
$ echo "another command before pipe doesn't matter" |./test.sh test3
Command line from history: 'echo "another command before pipe doesn't matter" |./test.sh test3'
Direct output to TTY, no pipe involved.
stdout is not a pipe.
/dev/pts/3
Readlink test status okay, no pipe involved.
История командной строки работает только без шебанга в верхней строке скрипта. Не знаю, будет ли это работать надежно и на других системах тоже.
Мне не удалось подавить вывод из «readlink» (или «file», как было предложено в Archemar ), когда статус был успешным («/dev/pts/3» ). Передача вывода в /dev/null или в переменную приведет к неисправности. Так что это не вариант для меня в сценарии.
Проверка телетайпа, о которой упоминал муру, проста и, возможно, уже достаточна для некоторых случаев использования.
Редактировать :Моя заслуга mosvy, потому что вопрос был в том, как получить полную командную строку, а не только определить, находится ли скрипт на трубе. я люблю простая часть «fc -nl -0» в его ответе, потому что дальнейшая настройка системы не требуется. Это не 100-процентное решение, но это только для моего личного использования и поэтому достаточно. Спасибо всем остальным за вашу помощь.
У меня была такая же проблема. Пытался установить BTFS на дроплете Digital Ocean с сервером Ubuntu. После установки пытаюсь запустить:
btfs init
Получал этот вывод:
Find metadata failed: No such file or directory
После правильного добавления пути после этого вопроса:
Как правильно добавить путь в PATH?
Работает
Generating TRON key with BIP39 seed phrase...
Теперь завершаем настройку, и проект Allspot будет иметь свой собственный узел BTFS!