쉘 스크립트와 파일의 상대적 위치

쉘 스크립트와 파일의 상대적 위치

나는 Linux의 쉘 스크립트나 명령에 대해 전혀 아는 바가 없습니다.

라는 파일이 있습니다projectx

projectX방금users/hardik/desktop/projectx

쉘 스크립트를 만들었습니다 start.sh. 쉘 스크립트의 내용은 다음과 같습니다.

echo "Starting typescript build in new terminal.."

osascript -e 'tell application "Terminal" to do script "npm run build"' 

sleep 3

echo "Starting firebase functions...."

osascript -e 'tell application "Terminal" to do script "firebase emulators:start --only functions"'


echo "Process compelete.. Check if there were two terminals window open"

이제 이것은 작동하지만 여기서는 다음과 같이 말합니다.

osascript -e 'tell application "Terminal" to do script "npm run build"'

루트 디렉터리에서 실행 중이므로 다음 오류가 발생합니다.

ENOENT: 해당 파일이나 디렉터리가 없습니다. 열려 있습니다./Users/hardik/package.json

상대 경로에서 실행되게 하려면 어떻게 해야 합니까?start.sh

업데이트: 시도해 보았지만 작동하지 않았습니다.

cd "$(dirname $(readlink -f "$0"))"
echo "Starting typescript build in new terminal.."
osascript -e 'tell application "Terminal" to do script "npm run watch:scss"' 
osascript -e 'tell application "Terminal" to do script "npm run watch"'
echo "Process compelete.. Check if there were two terminals window open"

위에 녹음한 내용이에요

readlink: illegal option -- f
usage: readlink [-n] [file ...]
usage: dirname path
Starting typescript build in new terminal..
tab 1 of window id 1579
tab 1 of window id 1580

아래 코드 조각도 작동하지 않습니다.

cd -P -- "${0%/*}" || exit
echo "Starting typescript build in new terminal.."
osascript -e 'tell application "Terminal" to do script "npm run watch:scss"' 
osascript -e 'tell application "Terminal" to do script "npm run watch"'
echo "Process compelete.. Check if there were two terminals window open"

같은 오류

답변1

스크립트에 cd -P -- "${0%/*}" || exit또는 를 추가하여 cd -P -- "$(dirname -- "$0")" || exit 스크립트가 있는 디렉터리로 이동할 수 있습니다.

$0내장 변수인터프리터에 저장된 스크립트의 경로입니다. 에서 스크립트를 찾는 경우 일반적으로 절대 경로입니다 $PATH.

${0%/*}구성은 쉘의 내장을 사용합니다.문자열 연산/*디렉터리 이름만 남도록 끝에서 일치하는 변수의 가장 짧은 비트를 제거합니다 (일반적으로 그렇듯이, $0이는 최소한 하나의 문자가 포함되어 있는 한 /작동합니다 ).

답변2

이것이 MacOS에서 작동하는지 모르겠습니다. Linux에서는 다음과 같습니다.

#! /bin/bash
  
arg1="$(awk 'BEGIN { RS="\0" }; NR==2 { print $0 "x"; exit; }' /proc/$$/cmdline; echo x)"
arg1="${arg1%x}"

if [[ $arg1 =~ / ]]; then
    # path contains at least one /
    dir_rel_path="${arg1%/*}"
    cd "$dir_rel_path"
fi

echo "$PWD"

관련 정보