나는 사용하려고 ls
명령 오류가 발생했습니다.
bash: /bin/ls: cannot execute binary file
이 명령 대신 무엇을 사용할 수 있습니까?
나는 사용하려고 ls
명령 오류가 발생했습니다.
bash: /bin/ls: cannot execute binary file
이 명령 대신 무엇을 사용할 수 있습니까?
답변:
대신에 echo
또는 find
명령을 사용할 수 있습니다 ls
.
echo *
또는:
find -printf "%M\t%u\t%g\t%p\n"
echo -- *
-n
현재 디렉토리에서 호출 된 파일이있는 경우 , 에코 할 것이 아니라 플래그로 해석됩니다.
touch ./-n
rm -rf /tmp/foo && mkdir /tmp/foo && cd /tmp/foo && touch ./-n oops && set -x && ls && echo *
echo
명예되지 것 --
, 그 자체 . 그래서 어떻게 echo -- *
어떤보다 더 좋은 echo "" *
, 더 나은 아직, 또는 echo "The file(s) are:" *
?
printf
echo 대신 다음 명령을 사용할 수도 있습니다 .
printf '%s\n' *
printf
echo
이 상황에서 인수 목록의 끝을 나타 내기 위해 "이중 대시"( )를 고려 echo
하지 않는 점 에서 우수 --
합니다 (우분투 14.04를 포함한 일부 시스템에서는 테스트 한 것입니다).
llama@llama:~$ mkdir -p Misc/unix210948
llama@llama:~$ cd !$
cd Misc/unix210948
llama@llama:~/Misc/unix210948$ touch -- -n
llama@llama:~/Misc/unix210948$ ls
-n
llama@llama:~/Misc/unix210948$ echo *
llama@llama:~/Misc/unix210948$ echo -- *
-- -n
llama@llama:~/Misc/unix210948$ printf '%s\n' *
-n
이 경우 원하는 echo
파일을-n
이 옵션으로 해석되고 이중 대시가 작동하지 않으므로을 사용해야합니다 printf
).
알 수없는 데이터를 처리 할 때는 항상 위와 같은 형식 문자열을 사용해야합니다. printf
그렇지 않으면 예기치 않은 결과가 발생할 수 있기 때문에 (댓글에서 지적 한 @ G-Man 덕분에)!
llama@llama:~/Misc/unix210948$ rm ./-n
llama@llama:~/Misc/unix210948$ touch '\n'
llama@llama:~/Misc/unix210948$ ls
\n
llama@llama:~/Misc/unix210948$ printf -- *
llama@llama:~/Misc/unix210948$ printf '%s\n' *
\n
라는 파일 \n
은에 의해 개행 문자로 해석됩니다 printf
. 이를 피하기 위해 printf
(%s
)에 하고 파일 이름을 전달합니다 (전과 같이 globbing을 통해 확장).
이 printf
+ 서식 문자열 솔루션은 (사람들이로 시작이며, 또한 취급 "숨겨진"파일, 파일 이름의 다양한 처리 할 수 .
,과 동일 ls
)
llama@llama:~/Misc/unix210948$ rm ./*
zsh: sure you want to delete all the files in /home/llama/Misc/unix210948/. [yn]? y
llama@llama:~/Misc/unix210948$ touch -- '-n' '\n' 'name with spaces' '.hidden'
llama@llama:~/Misc/unix210948$ ls
-n \n name with spaces
llama@llama:~/Misc/unix210948$ printf '%s\n' *
-n
\n
name with spaces
귀하의 printf
지원이 있다면 %q
( printf '%q\n' *
)을 사용할 수도 있습니다 . 파일 이름에 이상한 문자가 있으면 공백, 줄 바꿈 등을 피할 수 있습니다. ( 이 점을 지적한 채팅 에서 @muru 에게 감사드립니다 !)
'%s'
(과 \n
및 / 또는 원하는 다른 일정 텍스트). 예를 들어, 명령을 시도하십시오 touch '%.0s' foo bar; ls; printf -- *
. 반대로, 형식 문자열 --
이있을 때 왜 필요한지 알 수 없습니다 '%s\n'
.
--
형식 문자열로 불필요한 것을 간과 했고 다른 것을 다루기 위해 게시물을 편집했습니다.
-n
파일 이름은 정직 하지 않아야 는 POSIX-2001 +에 전혀 문제가 될 echo
가 SUSv3 시스템 - echo
유틸리티입니다 필요한 어떠한 옵션을 적용 할 수 없습니다. bash
의 echo
어떤 다른 사람이 비록 옵션을 처리 할 수 있지만, bash
빌드 옵션으로 컴파일 할 수 있습니다 --enable-xpg-echo-default
제대로 모든 시간의 동작하도록 할 수 있습니다. 그러나에 대한 올바른 동작 은 인수에서 항상 백래시 이스케이프를 해석 echo
하는 것을 의미 합니다. 따라서 C 스타일 이스케이프 가 있는 파일 이름은 충실도없이 출력에 기록 되지 않습니다 . echo
echo
.
당신은 아마 당신 과 당신의 기계에 무슨 일이 일어나고 있는지에 대한 더 나은 아이디어를 얻으려면 file
and uname
유틸리티를 사용해야합니다 . 오류는 호출 된 시스템 아키텍처와 호환되지 않는 시스템 아키텍처 용으로 컴파일 된 이진 실행 파일을 나타냅니다.
내 컴퓨터에서 :
uname -m; file /bin/ls
...인쇄물...
x86_64
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=..., stripped
세상의 모든 것이 옳기 때문입니다. 그러나 여기 ssh
내 데스크톱 과의 연결로 내 안드로이드 태블릿에서 실행되는 몇 가지 명령이 있습니다 ...
#first copy android ls to desktop
scp /system/bin/ls "$ssh:arm_ls"
ls 100% 151KB 151.4KB/s 00:00
#next login to desktop and run the following
ssh "$ssh" '
HOME=./arm_ls
chmod +x ~
file ~
bash -c ~ ||
rm ~
'
./arm_ls: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped
bash: ./arm_ls: cannot execute binary file: Exec format error
HOME=
난 그냥 할 수 있도록 것입니다 ~
배의 무리 대신의 ./arm_ls
편의를 위해를 -. 연습의 요점은 x86 데스크탑에서 arm 바이너리를 사용할 수 없으며, 출력이 file
sydtem의 기본 바이너리와 매우 다른 종류의 바이너리임을 보여주기를 원한다는 것입니다. 그래서 전체 크로스 컴파일을 shpw하기보다는 x86 장치의 팔 장치에서 사용할 수있는 호환되지 않는 바이너리를 cpy로 선택하고 결과와 bash
오류를 발생 시키는 방법을 보여주었습니다 .
bash (또는 다른 많은 쉘)를 사용하여 탭 완성을 사용하여 파일을 나열 할 수 있습니다.
$ thisisnotacommand ./public_html/<TAB>
acc/ papers/ android/ l/
sdr/ blast formalcss.html switch/
busy/ formalcss.tar.gz others/ together.jpg
ls -l
파일 크기, 권한, 소유자, 타임 스탬프 등과 같은 것을 원하는 경우 stat -- *
도움이 될 수 있습니다.
$ ls -l
total 8
-rw-rw-r-- 1 ubuntu ubuntu 4 Jun 20 21:50 a.txt
-rw-rw-r-- 1 ubuntu ubuntu 279 Jun 20 21:50 b.txt
$ stat -- *
File: ‘a.txt’
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 787691 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ ubuntu) Gid: ( 1000/ ubuntu)
Access: 2015-06-20 21:50:23.395223851 -0700
Modify: 2015-06-20 21:50:23.395223851 -0700
Change: 2015-06-20 21:50:23.395223851 -0700
Birth: -
File: ‘b.txt’
Size: 279 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 844130 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ ubuntu) Gid: ( 1000/ ubuntu)
Access: 2015-06-20 21:50:31.763084155 -0700
Modify: 2015-06-20 21:50:51.066758216 -0700
Change: 2015-06-20 21:50:51.066758216 -0700
Birth: -
$
또는 틀린 철자가 틀린 ls
경우 대신 시도하십시오sl
. ;-) (계속해보십시오. 설치해야 할 수도 있습니다)
사용하다
echo -- *
find . -printf "%M\t%u\t%g\t%p\n"
ls -C -b
libc*so
이나 당신을 망쳐 놓았을 것입니다ld-linux*so