Bash의 백그라운드 작업 목록에서 필드를 검색하는 함수를 작성하고 싶습니다. 예를 들어 특정 매개변수를 가져옵니다.
vim을 백그라운드로 보내서 "jobs"에 다음 목록이 표시된다고 가정해 보겠습니다.
[1]+ Stopped vim ~/.bashrc
내 기능은 다음과 같습니다
function jf {
echo `jobs | awk 'NR==$1{print $$2}'`;
}
그런 다음 다음과 같이 부릅니다.
jf 1 4
첫 번째 행의 네 번째 열인 "~/.bashrc"를 반환할 것으로 예상했지만 그렇지 않습니다. 내가 뭘 잘못했나요?
답변1
awk
쉘 변수에서 값을 전달하고 싶다는 것을 나타내야 합니다 . 함수 정의에서 다음과 같은 것이 트릭을 수행해야 합니다.
function jf {
echo `jobs | awk -v LINENO=$1 -v COLUMNNO=$2 'NR==LINENO {print $COLUMNNO}'`
}
답변2
작은따옴표는 bash가 매개변수를 대체하는 것을 방지합니다. 언급한 것처럼 큰따옴표는 덜 엄격하게 해석됩니다.
Manat Walker는 다음과 같이 썼습니다.
awk "NR==$1{print \$$2}"
그래도 내 기능의 "echo `...`" 부분이 문제를 일으키고 있지만 너무 복잡해서 전혀 필요하지 않은 것 같습니다. 이 새로운 기능은 저에게 효과적입니다.
function jf {
jobs | awk "NR==$1{print \$$2}";
}