私は教授からこのLinuxスクリプトを受け取り、それが何をしているのか理解しようとしています。ところで、ひとつ混乱する部分がありました。junk
この行の機能は何ですか?
who | while read user junk
その目的は何ですか?インターネットを検索しようとしましたが、ゴミ文字を引用する以外には見つかりませんでした。完全なスクリプトは次のとおりです。
#!/bin/bash
#Run a while loop using input of user command
who | while read user junk
do
#Get users real name from /etc/passwd file
realname=`grep $user /etc/passwd | cut -d: -f5`
echo "User: $realname ($user)"
#Get user's logged in time using who command
loggedin=`who | grep $user | awk '{print $3" "$4}'`
echo "Logged in: $loggedin"
#Get home directory of the user from /etc/passwd file
homedir=`cat /etc/passwd | grep $user | cut -d":" -f6`
echo "Home Directory is $homedir"
#Get count of all files in user's home directory
#including sub-directories (excluding directory count) using find command
file_dir_count=`find $homedir -type f | wc -l`
echo "Home directory contains $file_dir_count files"
#Get user's processes count using ps command
proc_count=`ps -u $user --no-headers | wc -l`
echo "$user has $proc_count processes"
#Display user's top 7 memory using process list in given order using top
echo "Top 7 processes sorted by Memory Usage:"
top -b -n 1 -u $user -o %MEM | head -14 | tail -8 | awk '!($3="")'
done
ベストアンサー1
read
スクリプトで使用される方法は、出力の各行の最初の単語をwho
変数として読み込むことを意味しますuser
。残りの行(最初のスペースまたはタブで)変数にjunk
。
デフォルトでは、文字(スペース、タブ、改行)で区切られた単語は、リストされている各変数にread
読み込まれます。$IFS
リストされた最後の変数は、前の変数に単語を割り当てた後に残ったデータを取得します。
これは、各行の最初の単語だけを読む安価な方法です。
望むより」「IFS=read-r-line」を理解する「詳細については。
スクリプトに一部質問。たとえば、ユーザーのユーザー名が互いの部分文字列(たとえば、および)の場合、bill
誤った結果(エラーの可能性が高い)が発生しますbilly
。ユーザーファイルのファイル名に改行文字が含まれていても、誤った結果が生成されます。
また実行しますwho
再びread
また、この情報が初期化に合格した可能性がある場合でも、各ユーザーに対してその初期コマンド/etc/passwd
の各出力行を複数回読み取ります。who
処理を情報収集部分に分割することをお勧めします(情報をgetent passwd "$user"
取得するには単一の呼び出しを使用しますが、passwd
いいえ主に対話型監視ツールを使用しtop
、別々のレポートセクション(出力用)を使用します。空白(空白行など)を使用すると、読みやすさも向上します。