Я пытаюсь создать простой файл журнала с именем «users.txt», который содержит имя пользователя, полное имя и домашний каталог введенного имени пользователя. Я также хочу включить время первоначального запуска сценария.
Какие-либо предложения?
Имя скрипта называется catbash.sh
Я пробовал такие вещи, как catbash.sh > user.txt
Но я понятия не имею, как получить конкретную информацию и т.
clear
LOGFILE=/home/student/gg193/FileTypes/TextFiles/ShellScripts/user.txt
read -p "What is your username?" username
read -p "May I know your name please? " name surname
echo "$(date) $username $name $surname $LOGFILE" >> $LOGFILE
TIME=$(date "+%H")
if [ $TIME -ge 0 -a $TIME -lt 12 ]
then
echo "\nGood Morning, $surname"
elif [ $TIME -ge 12 -a $TIME -lt 18 ]
then
echo "\nGood afternoon $surname"
else
echo "\nGood evening $surname"
fi
echo "1. nonblank\n2. number\n3. ends\n4. nends\n"
while :
do
read INPUT_STRING
case $INPUT_STRING in
nonblank)
NonEmptyLine=$(cat catbash.sh | sed '/^\s*$/d' | wc -l)
echo "\nNumber of Non-Empty Lines are:" $NonEmptyLine
break
;;
number)
EmptyLine=$(grep -cvP '\S' catbash.sh)
echo "\nNumber of Empty Lines are:" $EmptyLine
break
;;
ends)
echo "================================================================================ = "
sed 's/$/$/' catbash.sh
echo "================================================================================ = "
break
;;
nends)
NonEmptyLine=$(cat catbash.sh | sed '/^\s*$/d' | wc -l)
echo "\nNumber of Non-Empty Lines are:" $NonEmptyLine
EmptyLine=$(grep -cvP '\S' catbash.sh)
echo "\nNumber of Empty Lines are:" $EmptyLine
echo "================================================================================ = "
sed 's/$/$/' catbash.sh
echo "================================================================================ = "
break
;;
*)
echo "\nSorry, I don't understand"
;;
esac
done
DURATION=$(ps -o etime= -p "$$")
echo "\nAmount of time that has passed since the script was initially executed:" $DURATION
echo "\nThanks for using catbash.sh!"
Вы должны вести журнал изнутри скрипта sh. Например, вы можете echo
указать нужную информацию на терминале (что вы уже делаете), а затем добавить | tee -a $LOGFILE
(определить LOGFILE вверху, чтобы вам нужно было изменить только один раз, если вам нужно другое имя/местоположение файла).
В качестве дальнейших улучшений вы можете определить свою собственную функцию ведения журнала или даже изучить существующие. Например, более простая функция регистратора может принимать 2 аргумента - сообщение, имя файла. Само сообщение может состоять из имени пользователя, даты/времени и т. д. по вашему желанию.
С информацией, которая в настоящее время находится в вашем вопросе, это лучший указатель, который я могу дать.
LOGFILE=/home/student/gg193/FileTypes/TextFiles/ShellScripts/user.txt
read -p "What is your username?" username
read -p "May I know your name please? " name surname
echo "$(date) $username $name $surname $LOGFILE" >> $LOGFILE
Добавление этого теперь создало сообщение об ошибке «Cannot Fork on Line 29», что теперь?
Что такое строка 29 в вашем сценарии оболочки? Я попробовал это в своем сценарии оболочки, и он работал нормально, и я вижу новый файл журнала.
NonEmptyLine=$(cat catbash.sh | sed '/^\s*$/d' | wc -l)
это строка 29. код правильный, не знаю, почему он не работает
Эта линия прекрасна, и она работает для меня. Если вы по-прежнему получаете сообщения об ошибках «невозможно разветвить», это указывает на ограничения для новых открытых файлов, которые могут быть очень низкими. Это ваша личная машина или общая машина?
Это моя личная машина, НО линукс на сервере, я подключаюсь к нему с помощью PuTTY
Да, ваш скрипт находится на удаленном сервере. Я предполагаю, что у вас нет sudo
привилегий. Если вы это сделаете, вы можете попробовать изменить некоторые ограничения. Даже в противном случае проблема связана с той строкой 29, которая пытается cat
файл. Попробуйте просто заменить эту строку на NonEmptyLine=0
. Если это работает, это указывает на очень низкий лимит открытых файлов для вашей учетной записи.
Я определил LOGFILE вверху под названием
LOGFILE=/home/student/gg193/FileTypes/TextFiles/user.txt
, а под ним у меня есть echo'decho "Time: $(date)." >> $LOGFILE
это правильно?