Valgrind /usr/lib 파일은 일반 Linux 파일이 아닙니다.

Valgrind /usr/lib 파일은 일반 Linux 파일이 아닙니다.

오늘(Linux가 포함된 장치에서) 겪고 있는 문제는 일부 파일(특히 Valgrind /usr/lib파일)이 매우 이상하게 작동하여 복사할 수 없다는 것입니다 scp(오류는 not a regular file: ).

그래서:

$ ls -al /usr/lib/*valgrind*
drwxr-xr-x    2 root     root          4096 Sep 30 00:01 .
drwxr-xr-x   24 root     root         12288 Sep 30 00:00 ..
-rwxr-xr-x    1 root     root       1816444 Jun  6  2014 cachegrind-x86-linux
-rwxr-xr-x    1 root     root       1910732 Jun  6  2014 callgrind-x86-linux
-rw-r--r--    1 root     root         28429 Jun  6  2014 default.supp
-rwxr-xr-x    1 root     root       1884080 Jun  6  2014 drd-x86-linux
-rwxr-xr-x    1 root     root       1770688 Jun  6  2014 exp-bbv-x86-linux
-rwxr-xr-x    1 root     root       1852668 Jun  6  2014 exp-ptrcheck-x86-linux
-rwxr-xr-x    1 root     root       1910200 Jun  6  2014 helgrind-x86-linux
-rwxr-xr-x    1 root     root       1778880 Jun  6  2014 lackey-x86-linux
-rwxr-xr-x    1 root     root       1792524 Jun  6  2014 massif-x86-linux
-rwxr-xr-x    1 root     root       1942904 Jun  6  2014 memcheck-x86-linux
-rwxr-xr-x    1 root     root       1766560 Jun  6  2014 none-x86-linux
-rwxr-xr-x    1 root     root          2620 Jun  6  2014 vgpreload_core-x86-linux.so
-rwxr-xr-x    1 root     root         65296 Jun  6  2014 vgpreload_drd-x86-linux.so
-rwxr-xr-x    1 root     root         17904 Jun  6  2014 vgpreload_exp-ptrcheck-x86-linux.so
-rwxr-xr-x    1 root     root         37908 Jun  6  2014 vgpreload_helgrind-x86-linux.so
-rwxr-xr-x    1 root     root         15128 Jun  6  2014 vgpreload_massif-x86-linux.so
-rwxr-xr-x    1 root     root         26652 Jun  6  2014 vgpreload_memcheck-x86-linux.so

먼저, 이름에 "valgrind" 문자열이 없다는 점에 유의하세요.

그런 다음 일반 파일(파이프나 장치가 아님)로 나타납니다. 그러나 매우 이상하게도 간단한 방법으로는 찾을 수 없습니다 ls.

$ ls -al /usr/lib/memcheck-x86-linux
ls: /usr/lib/memcheck-x86-linux: No such file or directory

일반 목록에도 나타나지 않습니다.

$ ls -al /usr/bin
(snipped)

Linux에서 이러한 동작이 발생하는 원인은 무엇입니까?

또한 장치에는 "파일"과 같은 유틸리티가 없지만 이것이 나에게 많은 도움이 될지는 의문입니다.

출력 df:

$ df
Filesystem           1024-blocks    Used Available Use% Mounted on
/dev/root               980308    175548    754964  19% /
tmpfs                    10240       112     10128   1% /dev
tmpfs                   246728         0    246728   0% /tmp
tmpfs                     2048        12      2036   1% /var/log
tmpfs                   246728       128    246600   0% /dev/shm
tmpfs                   246728         0    246728   0% /run
tmpfs                   246728        20    246708   0% /var/run

그러니까 /장치입니다.

그리고:

$ whoami
root

그래서 나는 뿌리입니다.

퍼즐을 완성하려면:

$ ls -al /dev/root
ls: /dev/root: No such file or directory

따라서 매핑된 장치는 실제로 존재하지 않습니다.

답변1

이 출력은 다음과 같습니다.

$ ls -al /usr/lib/*valgrind*
drwxr-xr-x    2 root     root          4096 Sep 30 00:01 .
drwxr-xr-x   24 root     root         12288 Sep 30 00:00 ..
-rwxr-xr-x    1 root     root       1816444 Jun  6  2014 cachegrind-x86-linux

이는 이름이 지정된 디렉토리를 나열하고 있음을 의미합니다 /usr/lib/*valgrind*(아마도 그냥 /usr/lib/valgrind). 가장 큰 단서는 .및 에 대해 표시되는 디렉토리 항목 입니다 ...

이는 ls -al /usr/lib/memcheck-x86-linux파일이 존재하지 않는다고 말하는 이유를 설명합니다. 파일이 호출되기 때문입니다 /usr/lib/valgrind/memcheck-x86-linux.

디렉토리를 나열하고 하나의 항목으로 표시하지 않으려면 -d다음에 플래그를 추가하십시오 ls.

$ ls -ald /usr/lib/*valgrind*
drwxr-xr-x    2 root     root          4096 Sep 30 00:01 /usr/lib/valgrind

scp명령줄이나 출력을 제공하지 않았기 때문에 "일반 파일이 아님"이라고 표시되는 이유는 scp추측해야 하지만 내 생각에는 이것이 scp파일이 아닌 매개 변수에 대해 생성하는 출력 인 것 같습니다. 단순히 그것이 존재하지 않기 때문에 어떤 종류의.

답변2

마이클 호머(Michael Homer)가 쓴 글이지만무엇일어났다, 여기 있다그런 일이 발생합니다(그의 답변에 대한 귀하의 의견을 고려하면 귀하가 이미 알고 있다고 가정하지만 이 문제가 있는 다른 사람들은 그렇지 않을 수도 있습니다).

당신이 내린 명령은

ls -al /usr/lib/*valgrind*

ls가 실행되기 전에도 쉘은 별표를 해석하여 패턴과 일치하는 파일 이름 목록으로 대체합니다. 이제 일치하는 이름이 하나만 있는 경우(예: /usr/lib/valgrind) 물론 목록에는 해당 이름만 포함됩니다. 따라서 실행되는 실제 명령은 다음과 같습니다.

ls -al /usr/lib/valgrind

이제 ls는 매개변수가 주어졌음을 확인하고 해당 단일 매개변수를 조사하면 그것이 디렉토리임을 알 수 있습니다. 해당 옵션을 제공하지 않았으므로 -d디렉토리 이름의 경우 디렉토리 항목이 나열되지 않고 디렉토리 내용이 나열됩니다. 그리고 단지 주어진 이후로하나의디렉토리 이름을 사용하는 경우 디렉토리 이름을 먼저 인쇄하지 않습니다(단일 디렉토리 이름을 인수로 제공하면 나열된 파일이 어느 디렉토리에 속하는지 의심할 여지가 없기 때문입니다. ls디렉토리 이름이 다음에서 유래했는지 전혀 알 수 없습니다 . 파일 이름 확장자).

디렉토리의 실제 이름을 알고 싶다면(리터럴은 /usr/lib/valgrind추측임을 기억하세요(비록 하나일 수도 있지만 )일 수도 있음 /usr/lib/valgrind-3.7) 다음을 사용할 수 있습니다.

ls -ald /usr/lib/*valgrind*

.valgrind또한 추가 숨겨진 디렉터리 나 숨겨진 파일(예 .valgrind-foo: ) /usr/lib이 있는 경우아니요ls-a쉘 확장은 사용자가 제공한 옵션에 관심이 없고 해당 파일이 파일 목록에 포함되어 있지 않기 때문에 해당 파일도 보고 싶어한다는 것을 알지 못하기 때문에 ls옵션 ls에도 불구하고 명령에 의해 계속 표시됩니다. 따라서 도트 파일도 나열되는지 확인하려면 다음을 사용해야 합니다.

ls -ld /usr/lib/*valgrind* /usr/lib/.*valgrind*

이는-a아니요인수로 주어진 포인트 파일은 에서 무조건 나열되기 때문에 여기에 필요합니다 ls. 물론, valgrind도트 파일을 포함하여 이름에 포함된 디렉터리의 내용을 나열하려면~ 할 것이다-a이러한 도트 파일은 확장 후 명령줄에 표시되지 않기 때문에 필요합니다 . 즉, 이 경우에는 다음을 사용합니다.

ls -la /usr/lib/*valgrind* /usr/lib/.*valgrind*

반면에, 일치하는 디렉토리 내용에는 관심이 있지만 .*valgrind*그 안에 포함된 도트 파일에는 관심이 없다면 이는 사용되지 않습니다 -a.

사용하는 경우 bash(아마도 다른 쉘에서도 마찬가지지만 확실하지는 않습니다) 처음 두 명령을 다음과 같이 단순화할 수 있습니다.

ls -ld /usr/lib/{,.}*valgrind*

각기

ls -la /usr/lib/{,.}*valgrind*

관련 정보