여러 인수 대체가 있는 Xargs - sh -c '...' 다음에 환경 변수 인수 사용

여러 인수 대체가 있는 Xargs - sh -c '...' 다음에 환경 변수 인수 사용

이것은 내 명령입니다:

find $1 -name "*.html"  | sort -n | xargs -I {} sh -c 'echo "Dumping file: "{} >> "$2"; w3m {} >> "$2" 2>&1'

어디:

$1은 확장자가 .html인 파일을 찾을 경로입니다.

$2는 정보를 기록하려는 파일입니다(덤프 파일: *html 및 이 html 파일에 포함된 정보).

문제는 $2가 해석되지 않는다는 것입니다. 아마도 이 변수가 '...' 사이에 있어서 큰따옴표를 사용해 보았지만 명령이 작동하지 않았습니다.

내 명령줄에 $2 정보를 전달하는 방법을 아는 사람이 있나요?

답변1

find "$1" -name "*.html" -print0 | sort -zn | xargs -r -0 -n 1 sh -c '
   echo "Dumping file: $2" >> "$1"; w3m "$2" >> "$1" 2>&1
' sh "$2"

또 다른 최적화는 다음과 같습니다.

find "$1" -name "*.html" -print0 | sort -zn | xargs -r -0 -n 1 sh -c '
   exec 1>> "$1" 2>&1
   echo "Dumping file: $2"
   w3m "$2"
' sh "$2"

echo두 명령 w3m모두 파일 설명자 1과 2를 사용하여 동일한 작업을 수행하므로 처음부터 한 곳에서 수행하는 것이 가장 좋습니다.

sh각 파일마다 하나씩 실행하지 않아도 됩니다 .

find "$1" -name "*.html" -print0 | sort -zn | xargs -r -0 sh -c '
   out=$1; shift
   for file do
     echo "Dumping file: $file"
     w3m "$file"
   done >> "$out" 2>&1
' sh "$2"

답변2

작은 따옴표에서 제거하십시오.

... sh -c 'echo "Dumping file: "{} >> '"$2"'; w3m {} >> '"$2"' 2>&1'

껍질은 모든 것을 하나로 묶어줍니다.

답변3

참조 문제를 해결하는 몇 가지 방법은 sh변수를 내부 인수로 전달하는 것입니다.

log=$2
... | xargs -I {} sh -c 'echo "Dumping file: $1" >> "$2"; w3m {} >> "$2" 2>&1' sh {} "$log"

또는 export관련 변수만 이름으로 참조할 수 있습니다.

export log=$2
... | xargs -I {} sh -c 'echo "Dumping file: $1" >> "$log"; w3m {} >> "$log" 2>&1' sh {} 

그러나 파일 이름이 이상한 경우 findplain이 xargs -L제대로 작동하지 않을 수 있다는 점에 유의하세요. 개행 문자와 -L후행 공백은 특별히 취급됩니다.

관련 정보