TL;DR 저는 비밀번호의 모든 폴더에 들어가 이름이 pid
. 그렇다면 파일이 에코됩니다.
pids=$(cat */*/bin/*pid)
echo $pids
>> 3742031 3741375 3741415 3742159
PID는 공백과 함께 아름답게 인쇄됩니다.
경로에서 PID를 찾기 위해 이 코드를 약간 변경했습니다.
pids=$(cat */*pid)
echo $pids
>> 37410543741078
이번에는 인쇄할 때 공백이 없다는 점에 유의하세요. 이제 이러한 모든 파일은 애플리케이션에 의해 자동으로 생성되므로 이러한 값이 저장되는 방식은 일관성이 있어야 합니다 \n
.
내 질문은 거의 동일한 코드입니다. 한 경우에는 문자열을 공백으로 연결하고 다른 경우에는 공백 없이 연결하는 이유는 무엇입니까? 고양이와 더 일관된 동작을 얻을 수 있는 방법은 무엇입니까? (에코가 아님).
해결 방법을 추가하세요.
파일에 관계없이 파일을 읽기 전에 공백을 추가합니다(예: sed '$s/$/ /' */pid). 이것으로 문제가 해결됩니다.
답변1
파일을 찾는 가장 좋은 방법은 find
명령입니다. 예를 들어:
for file in $(find / -type f -iname "*.pid"); do echo "$file = `cat $file | tr -d '\n'`"; done
문자열 변수의 내용을 표시하려면 큰따옴표를 사용해야 합니다. 그렇지 않으면 쉘 명령과 유사한 특수 문자(예: 연산자) 또는 문자열은 실제 쉘 명령으로 이해될 수 있으며 물론 쉘에서 "실행"됩니다.
첫 번째 경우에는 디렉터리를 검색하여 ".pid" 파일에 특수 문자(Unix 줄 바꿈 코드, 줄 바꿈 코드, LF 코드라고도 함)가 포함되어 있음을 발견했습니다. 그러나 검색의 두 번째 경우에는 ".pid" 파일 끝에 특수 개행 문자가 포함되어 있지 않습니다(파일에는 숫자만 문자열로 포함되어 있으며 개행 문자로 끝나지 않습니다). 언급된 ".pid" 파일을 16진수 편집기에서 찾아서 열고 마지막 문자를 확인해보세요. 파일의 내용은 0A
끝부분의 LF 코드(16진수)에 따라 달라질 수 있습니다.
일부 ".pid" 파일에는 이 LF 코드가 포함되어 있고 일부는 포함되어 있지 않습니다. 파일이 생성된 방식에 따라 다릅니다. 예를 들어, 표준 echo
명령은 일반적으로 줄 끝에 이 LF 코드를 추가합니다. 그러나 -n
echo 명령 출력 끝에 이 LF 코드를 추가하지 않는 매개변수를 사용할 수도 있습니다 .
root@formuler3ip:~# echo "666" > /tmp/test1
root@formuler3ip:~# echo -n "666" > /tmp/test2
root@formuler3ip:~# xxd -g 1 /tmp/test1
00000000: 36 36 36 0a 666.
root@formuler3ip:~# xxd -g 1 /tmp/test2
00000000: 36 36 36 666