나는 거의 항상 루트이기 때문에 최근에 권한 722로 bash 실행 파일을 만들었습니다. 파일의 내용은 다음과 같습니다.
#!/home/nolan/Documents/test/listFiles
[ $# -lt 1 ] && dirFocus = "" || dirFocus = $1
dirSize=$(ls -a $dirFocus | wc -w)
for ((a = 1; a <= $dirSize; a++)) ; do
i = 1
for ITEM in $(ls -a $dirFocus); do
declare -i i
declare -i a
if [ $a -eq $i ]; then
echo "$a : $ITEM"
fi
i = $[ $i + 1 ]
done
done
터미널에서 실행할 때 다음을 사용하십시오.
root @ /home/nolan/Documents/test: bash listFiles
1 : .
2 : ..
3 : apple
4 : dirCheck
5 : ifTest
6 : ifTest.txt
7 : listFiles
8 : myscript
9 : nolan.txt
10 : pointer_to_apple
11 : scriptx.sh
12 : Stuff
13 : weekend
14 : weekend2
15 : weekend3
예상대로 이런 결과가 나왔습니다. 그러나 두 번째는 다음과 같습니다.
root @ /home/nolan/Documents/test: ./listFiles
bash: ./listFiles: /home/nolan/Documents/test/listFiles: bad interpreter: Too
many levels of symbolic links
내가 얻는 오류입니다. 정확히 무엇이 잘못되었나요? 다른 포럼을 확인해 보았지만 내 상황에 맞지 않는 것 같습니다.
답변1
스크립트의 첫 번째 줄은 "shebang" 줄입니다. 스크립트를 해석하기 위해 실행할 프로그램을 커널(프로그램 로더)에 알려줍니다. 스크립트는 스크립트를 해석하기 위해 자체 실행을 시도하고, 스크립트는 다시 인터프리터를 해석하기 위해 자신을 호출합니다.
run script 를 사용하면 bash filename
커널이 호출되지 않지만 bash는 유효한 스크립트를 실행하는 데 사용됩니다.
놓다
#! /bin/bash
첫 번째 줄로 가면 모든 것이 잘 될 것입니다.
그런데, 시스템을 실험할 수 있는 제한된 권한을 가진 사용자를 만드세요. 왜냐하면 root
수리할 수 없는 것은 무엇이든 쉽게 파괴할 수 있기 때문입니다.
답변2
쵸로바가 설명을 너무 잘했네문제는 쉘 스크립트가 bash
.
다음은 스크립트 재구현에 대한 제안입니다.
구문 오류가 포함되어 있지 않습니다(
dirFocus = ""
예:=
할당에 공백이 없어야 하는 구문 오류).공백과 개행 문자가 포함된 파일 이름을 처리합니다. 출력을 반복하면
ls
해당 파일 이름이 부적격해지고wc -w
파일 이름에 공백이 포함된 경우 잘못된 개수가 계산됩니다.최신 쉘 구문(
$[ $i + 1 ]
사용되지 않는bash
구문)을 사용하십시오.소개하다매우 작은출력 개선(
(dir)
디렉토리 이름에 추가됨)
#!/bin/bash
shopt -s dotglob # make wildcards match hidden names by default
shopt -s nullglob # make wildcards expand to nothing if no match
count=0
for name in "${1:-.}"/*; do
count=$(( count + 1 ))
if [ -d "$name" ]; then
printf '%d : %s (dir)\n' "$count" "${name##*/}"
else
printf '%d : %s\n' "$count" "${name##*/}"
fi
done
이는 또한 파일 목록을 여러 번 확장하지 않는 반면, 코드는 ls
디렉터리의 각 이름에 대해 전체 디렉터리를 확장합니다.
${1:-.}
"비어 있거나 설정되지 않은 경우에는 그 안에 있는 내용을 사용하십시오 . $1
이 경우에는 사용하십시오 .
"를 의미합니다.
${name##*/}
"의 문자열 $name
이지만 마지막 숫자는 아님 /
"을 의미합니다.