このスクリプトでゴミは何をしますか?

このスクリプトでゴミは何をしますか?

私は教授からこの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、別々のレポートセクション(出力用)を使用します。空白(空白行など)を使用すると、読みやすさも向上します。

おすすめ記事