나는 교수님으로부터 이 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
하고 별도의 보고 섹션(출력용)을 사용합니다. 공백(예: 빈 줄)을 사용하면 가독성도 향상될 수 있습니다.