728x90
반응형
728x90
반응형
반응형

명령 프롬프트(Command, cmd.exe) 실행 시 로드되는 프로그램 확인 방법

  • Windows에서 명령 프롬프트(cmd.exe)를 실행할 때 자동으로 로드되거나 실행되는 프로그램 및 스크립트는 여러 경로를 통해 등록될 수 있습니다.
  • 이 문서에서는 그러한 항목들을 확인하는 주요 방법들을 정리합니다.


1. AutoRun 환경 변수 확인

  • cmd.exe는 실행 시 AutoRun이라는 레지스트리 키에 등록된 명령어 또는 배치 파일을 자동으로 실행합니다.

1.1. 확인 방법:

  • 명령 프롬프트에서 다음 명령을 입력합니다.

  • cmd

     reg query "HKCU\Software\Microsoft\Command Processor" /v AutoRun
     reg query "HKLM\Software\Microsoft\Command Processor" /v AutoRun
    
    • HKCU는 현재 사용자 기준 설정
    • HKLM은 모든 사용자 공통 설정
  • 여기에 등록된 경로에 .bat, .cmd, 기타 명령어가 있으면 cmd 실행 시 자동으로 실행됩니다.



2. 시작 프로그램 확인

  • Windows에 로그인할 때 자동 실행되는 시작 프로그램 중 일부는 명령 프롬프트를 통해 백그라운드로 실행될 수 있습니다.

2.1. 확인 방법:

  • Ctrl + Shift + Esc → 작업 관리자 → 시작 프로그램
  • 실행 창(Win ⊞ + R)에서 shell:startup 입력하여 시작 폴더 확인


3. 그룹 정책의 로그인 스크립트 확인

  • 로컬 그룹 정책 또는 도메인 정책에 의해 사용자의 로그인 시 실행되는 스크립트가 있을 수 있으며, 그 안에서 cmd를 호출할 수 있습니다.

3.1. 확인 방법:

  • (1) 실행 창에서 gpedit.msc 입력
  • (2) 사용자 구성Windows 설정스크립트(로그온/로그오프) 확인

  • 해당 위치에 등록된 스크립트는 로그인 시 자동 실행됩니다.


4. 로컬 스크립트 위치 확인

  • 로컬 그룹 정책에 의해 실행되는 스크립트의 실제 위치를 직접 확인할 수도 있습니다.

4.1. 위치:

  • cmd

     %SystemRoot%\System32\GroupPolicy\User\Scripts\Logon
    
  • 이 디렉터리 안의 .bat 또는 .cmd 파일이 로그인 시 실행됩니다.



5. 명령 프롬프트 바로가기 또는 배치파일 확인

  • 바탕화면, 작업표시줄, 기타 경로에 만들어진 명령 프롬프트 바로가기가 특정 배치파일을 실행하도록 설정되어 있을 수 있습니다.

5.1. 확인 방법:

  • 바로가기 속성의 “대상” 필드에 cmd /k script.bat 또는 cmd /c ... 와 같은 명령이 있는지 확인


6. 참고

  • 이 외에도 특정 개발 툴(VSCode, PowerShell, WSL 등)에서 명령 프롬프트를 내장 터미널로 사용할 때 자체적으로 초기화 스크립트를 불러올 수 있으니, 해당 환경별 설정도 함께 확인하는 것이 좋습니다.



  • 도움이 되셨으면 하단의 ❤️ 공감 버튼 부탁 드립니다. 감사합니다! 😄
  • 일부 모바일 환경에서는 ❤️ 버튼이 보이지 않습니다.

728x90
반응형
반응형
728x90
반응형
반응형

bash 스크립트 : 이벤트 발생 시 현재 시간 기반 파일에 로그 기록하기

bash

#!/bin/bash

# Bash 스크립트: 이벤트 발생 시 현재 시간 기반 파일에 로그 기록하기

# 현재 시간의 파일 이름 생성 함수
generate_filename() {
    # 현재 날짜와 시간 기반으로 파일 이름 생성
    echo "$(date +'%Y%m%d%H%M%S').txt"
}

# 로그 기록 함수
log_event() {
    local log_message=$1  # 로그 메시지 (사용자가 전달)
    local filename=$(generate_filename)  # 파일 이름 생성
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $log_message" > "$filename"  # 로그 메시지 기록
    echo "로그가 $filename 에 저장되었습니다."
}

# 이벤트 감지 및 실행 (여기서는 예제용으로 무한 루프와 키 입력 감지 사용)
while true; do
    echo "아무 키나 눌러 이벤트를 트리거하거나 'q'를 눌러 종료하세요."
    read -n 1 input  # 한 문자 입력받기
    
    if [[ $input == "q" ]]; then
        echo -e "\n프로그램을 종료합니다."
        break
    else
        # 로그 메시지를 작성 (여기서는 예제 메시지 사용)
        log_event "사용자가 이벤트를 트리거했습니다."
    fi
done

스크립트 설명

  1. generate_filename 함수:

    • 현재 시간을 기반으로 파일 이름을 생성합니다. 결과 예시: 20241210153030.txt.
  2. log_event 함수:

    • 전달받은 메시지를 로그로 기록합니다.
    • 로그 파일 형식: [YYYY-MM-DD HH:MM:SS] 메시지.
  3. 이벤트 감지 루프:

    • 무한 루프 안에서 키 입력을 기다립니다.
    • 사용자가 키를 누르면 로그가 생성됩니다.
    • q를 누르면 루프를 종료합니다.

실행 방법

  1. 파일로 저장 (예: event_logger.sh).
  2. 실행 권한 부여:
    chmod +x event_logger.sh
    
  3. 스크립트 실행:
    ./event_logger.sh
    
  4. 아무 키나 눌러 이벤트를 트리거하거나 q를 눌러 종료합니다.
728x90
반응형
반응형

bash에서 다른 스크립트를 불러와 환경 변수 설정하기

  • .bashrc와 같은 환경 설정 파일에서 다른 스크립트를 불러와 그 내용을 환경 변수에 설정하는 것은 가능합니다.
  • 이를 위해 source 명령어를 사용하거나, 스크립트의 출력값을 캡처하여 환경 변수로 설정하는 방법 등을 사용할 수 있습니다.

방법 1: source 사용

  • 다른 스크립트를 현재 쉘 세션에 불러오는 방법입니다.
# another_script.sh의 변수나 함수 불러오기
source /path/to/another_script.sh
  • 이 방법은 another_script.sh 안에 정의된 환경 변수나 함수가 현재 쉘 세션에 그대로 반영됩니다.

방법 2: 출력값 캡처 후 변수에 설정

  • 다른 스크립트의 실행 결과를 환경 변수로 저장하는 방법입니다.
export MY_VAR=$(bash /path/to/another_script.sh)
  • 예를 들어, another_script.sh가 특정 값을 출력한다고 가정하면:
#!/bin/bash
echo "example_value"
  • .bashrc에서 위와 같이 호출하면 MY_VARexample_value가 저장됩니다.

방법 3: 특정 변수만 추출하여 설정

  • 외부 스크립트에서 필요한 변수만 설정하여 가져오려면 eval을 사용할 수 있습니다.
eval $(bash /path/to/another_script.sh)
  • another_script.sh가 다음과 같이 환경 변수를 설정하는 출력을 제공한다면:
#!/bin/bash
echo "MY_VAR=example_value"
  • .bashrc에서 위처럼 작성하면 MY_VAR가 설정됩니다.

  • 위의 방법들을 활용하면 .bashrc에서 다른 스크립트의 내용을 동적으로 로드하거나 특정 값만 환경 변수로 설정할 수 있습니다.
  • 필요에 따라 적절한 방법을 선택하여 사용할 수 있습니다.
728x90
반응형
반응형

Starship : Cross-shell Prompt

Starship with iTerm2 and the Snazzy theme

모든 셸에 사용할 수 있는 최소의, 매우 빠른, 무한히 사용자 정의가 가능한 프롬프트!

  • 빠름 : 빠릅니다 – 정말 정말 빠릅니다! 🚀
  • 사용자 정의 가능 : 프롬프트의 모든 측면을 구성합니다.
  • 범용 : 모든 셸, 모든 운영 체제에서 작동합니다.
  • 지능형 : 관련 정보를 한눈에 보여줍니다.
  • 풍부한 기능 : 모든 인기 도구 지원.
  • 쉬움 : 설치가 빠르며 몇 분 안에 사용을 시작할 수 있습니다.

🚀 설치

필수 조건

역자 주) 너드 폰트와 유사한 문자를 지원하는 글꼴이면, 해당 글꼴을 사용하셔도 됩니다.

1단계. Starship 설치

설치 지침을 보려면 아래 목록에서 운영 체제를 선택하세요.

리눅스

  • 시스템에 맞는 최신 버전을 설치하세요:
curl -sS https://starship.rs/install.sh | sh
  • 다음 패키지 관리자를 사용하여 Starship을 설치할 수 도 있습니다.
배포 저장소 명령어
Any [crates.io] cargo install starship --locked
Any [conda-forge] conda install -c conda-forge starship
Any [Linuxbrew] brew install starship
Alpine Linux 3.13+ [Alpine Linux Packages] apk add starship
Arch Linux [Arch Linux Extra] pacman -S starship
CentOS 7+ [Copr] dnf copr enable atim/starship
dnf install starship
Gentoo [Gentoo Packages] emerge app-shells/starship
Manjaro pacman -S starship
NixOS [nixpkgs] nix-env -iA nixpkgs.starship
openSUSE [OSS] zypper in starship
Void Linux [Void Linux Packages] xbps-install -S starship

윈도우

  • 릴리스 섹션 에서 MSI 설치 프로그램을 사용하여 시스템에 최신 버전을 설치하세요.

  • 다음 패키지 관리자를 사용하여 Starship을 설치할 수 도 있습니다.

저장소 명령
[crates.io] cargo install starship --locked
[Chocolatey] choco install starship
[conda-forge] conda install -c conda-forge starship
[Scoop] scoop install starship
[winget] winget install --id Starship.Starship

2단계. Starship을 사용하기 위해 셸을 설정하세요

쉘을 구성하여 우주선을 초기화합니다. 아래 목록에서 선택하세요:

  • bash
    • ~/.bashrc의 끝에 다음을 추가합니다.
eval "$(starship init bash)"
  • Windows 명령 프롬프트 (Cmd)
    • Cmd와 함께 Clink (v1.2.30+)를 설치하여 사용해야 합니다.
    • 다음 내용으로 %LocalAppData%\clink\starship.lua 경로에 파일을 만듭니다.
load(io.popen('starship init cmd'):read("*a"))()
  • PowerShell
    • PowerShell 구성의 끝에 다음을 추가합니다($PROFILE을 실행하여 찾을 수 있음):
Invoke-Expression (&starship init powershell)
  • 나머지 구성은 starship 홈페이지를 참조하세요.

3단계. Starship 구성

새로운 셸 인스턴스를 시작하면 아름다운 새 셸 프롬프트가 표시됩니다. 기본 설정에 만족하신다면 즐겨보세요!

Starship을 더욱 맞춤화하고 싶다면:

  • 구성 – 프롬프트를 원하는 대로 조정하기 위해 Starship을 구성하는 방법을 알아보세요.

  • 사전 설정 – 다른 사람의 사전 구축된 구성에서 영감을 얻으세요

📝 라이센스

728x90
반응형
반응형

Windows Terminal에 Git Bash를 프로필 추가

Windows Terminal에 Git Bash를 프로필로 추가하려면 다음 단계를 따르시면 됩니다.

  1. Windows Terminal 설정 열기: Windows Terminal을 열고 설정(Settings)을 엽니다.

  2. JSON 파일 편집: 설정 화면에서 "Open JSON file"을 클릭하여 설정 파일을 엽니다.

  3. Git Bash 프로필 추가: JSON 파일에 Git Bash를 위한 새 프로필을 추가합니다. Git Bash가 기본 설치 경로(C:\Program Files\Git)에 있다고 가정하고 추가 예시를 작성했습니다. 다른 위치에 설치했다면 해당 경로로 변경하세요.

    {
        "guid": "{새로운-고유-id}",
        "name": "Git Bash",
        "commandline": "C:\\Program Files\\Git\\bin\\bash.exe",
        "icon": "C:\\Program Files\\Git\\mingw64\\share\\git\\git-for-windows.ico",
        "startingDirectory": "%USERPROFILE%"
    }
    
    • guid: 새 프로필의 고유 ID입니다. {} 괄호 안에 원하는 고유 식별자를 넣으시면 됩니다.
    • name: 프로필 이름입니다. "Git Bash"로 설정하면 됩니다.
    • commandline: Git Bash 실행 파일 경로입니다. 기본적으로 C:\Program Files\Git\bin\bash.exe 경로를 사용합니다.
    • icon: 아이콘 경로입니다. Git 설치 폴더 내에 있는 git-for-windows.ico를 지정하면 Git Bash 아이콘으로 표시됩니다.
    • startingDirectory: 시작 디렉토리를 설정할 수 있습니다. 기본적으로 %USERPROFILE%을 사용하여 사용자 홈 디렉토리에서 시작하도록 설정했습니다.
  4. 설정 저장 및 종료: JSON 파일을 저장하고 Windows Terminal을 재시작하면, 설정한 Git Bash 프로필이 추가된 것을 확인할 수 있습니다.

728x90
반응형
반응형

ShellCheck - 쉘 스크립트 정적 분석 도구

ShellCheck는 bash/sh 셸 스크립트에 대한 경고와 제안을 제공하는 GPLv3 도구입니다.

문제가 있는 쉘 스크립트 줄이 강조 표시된 터미널의 스크린샷

ShellCheck의 목표는 다음과 같습니다.

  • 셸을 발생시키는 일반적인 초보자 구문 문제를 지적하고 명확히 하기 위해 불분명한 오류 메시지를 표시합니다.

  • 전형적인 중급 수준의 의미 문제를 지적하고 명확히 하기 위해 셸이 이상하고 반직관적으로 동작하게 만듭니다.

  • 미묘한 단서, 예외 상황 및 함정을 지적하여 문제가 발생할 수 있는 경우를 알려드리겠습니다. 고급 사용자가 작성한 스크립트는 향후에는 제대로 작동하지 않을 수 있습니다.

ShellCheck가 어떤 코드 식별에 도움이 될 수 있는지 알아보려면 불량 코드 갤러리를 참조하세요!


사용방법

ShellCheck를 사용하는 방법에는 여러 가지가 있습니다!


웹 상에서

https://www.shellcheck.net 에 쉘 스크립트를 붙여넣어 즉각적인 피드백을 받으세요.

ShellCheck.net 은 항상 최신 git 커밋과 동기화되며 ShellCheck를 사용해 볼 수 있는 가장 쉬운 방법입니다. 친구들에게 알려주세요!


터미널에서

위에서 볼 수 있듯이, 터미널에서 shellcheck yourscript를 실행하면 즉시 출력이 나옵니다.


편집기에서

다양한 편집기에서 ShellCheck 제안을 직접 볼 수 있습니다.

인라인된 shellcheck 피드백을 보여주는 Vim의 스크린샷.

인라인된 shellcheck 피드백을 보여주는 emacs의 스크린샷.


빌드 또는 테스트 모음에서

ShellCheck는 주로 대화형 사용을 목적으로 하지만, 빌드나 테스트 모음에 쉽게 추가할 수 있습니다. 종료 코드를 표준으로 사용하므로 프로세스의 일부로 shellcheck 명령을 추가하기만 하면 됩니다.

예를 들어, Makefile에서:

check-scripts:
    # Fail if any of these files have warnings
    shellcheck myscripts/*.sh

또는 Travis CI .travis.yml 파일에서:

script:
  # Fail if any of these files have warnings
  - shellcheck myscripts/*.sh

ShellCheck가 사전 설치되어 바로 사용할 수 있는 서비스 및 플랫폼:

GitLab 을 포함한 대부분의 다른 서비스를 사용하면 다음을 설치할 수 있습니다. 시스템 패키지 관리자를 통해 직접 ShellCheck를 설치하세요(설치 참조). 또는 바이너리 릴리스 를 다운로드하여 압축을 풉니다.

어떤 경우에도 특정 ShellCheck 버전을 수동으로 설치하는 것이 좋습니다. 이렇게 하면 새로운 경고가 포함된 새 버전이 게시되면 예상치 못한 빌드가 중단됩니다.

사용자 정의 필터링 또는 보고를 위해 ShellCheck는 간단한 JSON, CheckStyle 호환 XML을 출력할 수 있습니다. GCC 호환 경고 및 사람이 읽을 수 있는 텍스트(ANSI 색상 포함 또는 미포함) 참조 더 많은 문서는 통합 위키 페이지를 참조하세요.


설치

ShellCheck를 로컬에 설치하는 가장 쉬운 방법은 패키지 관리자를 사용하는 것입니다.

Cabal이 있는 시스템에서(~/.cabal/bin에 설치):

cabal update
cabal install ShellCheck

Stack이 있는 시스템에서(~/.local/bin에 설치):

stack update
stack install ShellCheck

Debian 기반 배포판의 경우:

sudo apt install shellcheck

Arch Linux 기반 배포판에서:

pacman -S shellcheck

또는 AUR에서 종속성 무료 shellcheck-bin을 받으세요.

Gentoo 기반 배포판의 경우:

emerge --ask shellcheck

EPEL 기반 배포판에서:

sudo yum -y install epel-release
sudo yum install ShellCheck

Fedora 기반 배포판:

dnf install ShellCheck

FreeBSD에서:

pkg install hs-ShellCheck

Homebrew를 사용하는 macOS(OS X)의 경우:

brew install shellcheck

또는 MacPorts를 사용하면:

sudo port install shellcheck

OpenBSD에서:

pkg_add shellcheck

openSUSE에서

zypper in ShellCheck

또는 OneClickInstall을 사용하세요 - https://software.opensuse.org/package/ShellCheck

셀에서:

eopkg install shellcheck

Windows의 경우(chocolatey를 통해):

C:\> choco install shellcheck

또는 Windows(winget를 통해):

C:\> winget install --id koalaman.shellcheck

또는 Windows(scoop를 통해):

C:\> scoop install shellcheck

conda-forge에서:

conda install -c conda-forge shellcheck

Snap Store에서:

snap install --channel=edge shellcheck

Docker Hub에서:

docker run --rm -v "$PWD:/mnt" koalaman/shellcheck:stable myscript
# Or :v0.4.7 for that version, or :latest for daily builds

또는 더 큰 Alpine Linux 기반 이미지를 확장하려면 koalaman/shellcheck-alpine을 사용합니다. 일반 Alpine 이미지와 정확히 동일하게 작동하지만 shellcheck가 사전 설치되어 있습니다.

nix 패키지 관리자 사용:

nix-env -iA nixpkgs.shellcheck

Flox 패키지 관리자 사용

flox install shellcheck

또는 최신 릴리스에 대한 사전 컴파일된 바이너리를 여기에서 다운로드할 수 있습니다.

또는 다른 릴리스에 대해서는 GitHub 릴리스를 참조하세요. (매일 Git 빌드를 위한 최신 메타 릴리스 포함).

현재 Apple Silicon에 대한 공식 바이너리는 없지만 타사 빌드는 다음을 통해 사용할 수 있습니다. Visual Studio Code용 ShellCheck.

Distro 패키지에는 이미 man 페이지가 포함되어 있습니다. 소스에서 빌드하는 경우 다음을 사용하여 설치할 수 있습니다.

pandoc -s -f markdown-smart -t man shellcheck.1.md -o shellcheck.1
sudo mv shellcheck.1 /usr/share/man/man1

사전 커밋

pre-commit을 통해 ShellCheck를 실행하려면 .pre-commit-config.yaml에 후크를 추가하세요.

repos:
-   repo: https://github.com/koalaman/shellcheck-precommit
    rev: v0.7.2
    hooks:
    -   id: shellcheck
#       args: ["--severity=warning"]  # Optionally only show errors and warnings

트래비스 CI

Travis CI는 이제 기본적으로 ShellCheck를 통합했으므로 수동으로 설치할 필요가 없습니다.

여유롭게 업그레이드하거나 다음 사항을 확인하기 위해 여전히 그렇게 하려는 경우 최신 릴리스를 사용하려면 아래 단계에 따라 바이너리 버전을 설치하세요.


사전 컴파일된 바이너리 설치

사전 컴파일된 바이너리는 tar.xz 파일로 제공됩니다. 압축을 풀려면 다음을 확인하세요. xz가 설치되었습니다. Debian/Ubuntu/Mint에서는 apt install xz-utils를 사용해 설치할 수 있습니다. Redhat/Fedora/CentOS의 경우 yum -y install xz.

간단한 설치 프로그램은 다음과 같은 작업을 수행할 수 있습니다.

scversion="stable" # or "v0.4.7", or "latest"
wget -qO- "https://github.com/koalaman/shellcheck/releases/download/${scversion?}/shellcheck-${scversion?}.linux.x86_64.tar.xz" | tar -xJv
cp "shellcheck-${scversion}/shellcheck" /usr/bin/
shellcheck --version

소스에서 컴파일하기

이 섹션에서는 소스 디렉토리에서 ShellCheck를 빌드하는 방법을 설명합니다. ShellCheck는 Haskell로 작성되었으며 컴파일하는 데 2GB의 RAM이 필요합니다.


Cabal 설치

ShellCheck는 Cabal을 사용하여 빌드되고 패키징됩니다. 시스템의 패키지 관리자(예: apt-get, brew, emerge, yum 또는 zypper)에서 패키지 cabal-install을 설치합니다.

macOS(OS X)에서는 brew를 사용하여 Cabal을 빠르게 설치할 수 있습니다. 소스에서 컴파일하려고 하면 30분 이상 걸리는 반면, brew를 사용하면 몇 분 만에 설치가 완료됩니다.

$ brew install cabal-install

MacPorts에서는 패키지가 hs-cabal-install로 불리는 반면, 네이티브 Windows 사용자는 https://www.haskell.org/platform/에서 Haskell 플랫폼의 최신 버전을 설치해야 합니다.

cabal이 설치되어 있는지 확인하고 종속성 목록을 업데이트하세요.

$ cabal update

ShellCheck 컴파일

git clone을 통해 이 저장소를 복제하고 cd를 통해 ShellCheck 소스 디렉토리로 이동하여 빌드/설치합니다.

$ cabal install

이렇게 하면 ShellCheck가 컴파일되어 ~/.cabal/bin 디렉토리에 설치됩니다.

이 디렉토리를 PATH에 추가합니다(bash의 경우 ~/.bashrc에 추가):

export PATH="$HOME/.cabal/bin:$PATH"

로그아웃했다가 다시 로그인하여 PATH가 올바르게 설정되었는지 확인하세요.

$ which shellcheck
~/.cabal/bin/shellcheck

기본 Windows에서는 PATH가 이미 설정되어 있어야 하지만 시스템은 레거시 코드 페이지를 사용할 수 있습니다. cmd.exe, powershell.exe 및 Powershell ISE에서 Raster 글꼴이 아닌 TrueType 글꼴을 사용하고 활성 글꼴을 설정해야 합니다. chcp를 사용하여 코드 페이지를 UTF-8(65001)로 변경:

chcp 65001

Powershell ISE에서는 출력 인코딩을 추가로 업데이트해야 할 수도 있습니다.

[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

테스트 실행

단위 테스트 모음을 실행하려면:

$ cabal test

나쁜 코드 갤러리

그렇다면 ShellCheck는 어떤 종류의 것들을 찾습니까? 감지된 문제의 불완전한 목록은 다음과 같습니다.


인용

ShellCheck는 여러 유형의 잘못된 인용을 인식할 수 있습니다.

echo $1                           # Unquoted variables
find . -name *.ogg                # Unquoted find/grep patterns
rm "~/my file.txt"                # Quoted tilde expansion
v='--verbose="true"'; cmd $v      # Literal quotes in variables
for f in "*.ogg"                  # Incorrectly quoted 'for' loops
touch $@                          # Unquoted $@
echo 'Don't forget to restart!'   # Singlequote closed by apostrophe
echo 'Don\'t try this at home'    # Attempting to escape ' in ''
echo 'Path is $PATH'              # Variables in single quotes
trap "echo Took ${SECONDS}s" 0    # Prematurely expanded trap
unset var[i]                      # Array index treated as glob

조건문

ShellCheck는 다양한 유형의 잘못된 테스트 문을 인식할 수 있습니다.

[[ n != 0 ]]                      # Constant test expressions
[[ -e *.mpg ]]                    # Existence checks of globs
[[ $foo==0 ]]                     # Always true due to missing spaces
[[ -n "$foo " ]]                  # Always true due to literals
[[ $foo =~ "fo+" ]]               # Quoted regex in =~
[ foo =~ re ]                     # Unsupported [ ] operators
[ $1 -eq "shellcheck" ]           # Numerical comparison of strings
[ $n && $m ]                      # && in [ .. ]
[ grep -q foo file ]              # Command without $(..)
[[ "$$file" == *.jpg ]]           # Comparisons that can't succeed
(( 1 -lt 2 ))                     # Using test operators in ((..))
[ x ] & [ y ] | [ z ]             # Accidental backgrounding and piping

자주 오용되는 명령어

ShellCheck는 명령이 잘못 사용된 경우를 인식할 수 있습니다.

grep '*foo*' file                 # Globs in regex contexts
find . -exec foo {} && bar {} \;  # Prematurely terminated find -exec
sudo echo 'Var=42' > /etc/profile # Redirecting sudo
time --format=%s sleep 10         # Passing time(1) flags to time builtin
while read h; do ssh "$h" uptime  # Commands eating while loop input
alias archive='mv $1 /backup'     # Defining aliases with arguments
tr -cd '[a-zA-Z0-9]'              # [] around ranges in tr
exec foo; echo "Done!"            # Misused 'exec'
find -name \*.bak -o -name \*~ -delete  # Implicit precedence in find
# find . -exec foo > bar \;       # Redirections in find
f() { whoami; }; sudo f           # External use of internal functions

초보자들이 흔히 하는 실수

ShellCheck는 초보자가 흔히 겪는 구문 오류를 많이 인식합니다.

var = 42                          # Spaces around = in assignments
$foo=42                           # $ in assignments
for $var in *; do ...             # $ in for loop variables
var$n="Hello"                     # Wrong indirect assignment
echo ${var$n}                     # Wrong indirect reference
var=(1, 2, 3)                     # Comma separated arrays
array=( [index] = value )         # Incorrect index initialization
echo $var[14]                     # Missing {} in array references
echo "Argument 10 is $10"         # Positional parameter misreference
if $(myfunction); then ..; fi     # Wrapping commands in $()
else if othercondition; then ..   # Using 'else if'
f; f() { echo "hello world; }     # Using function before definition
[ false ]                         # 'false' being true
if ( -f file )                    # Using (..) instead of test

스타일

ShellCheck는 스타일 개선을 위한 제안을 할 수 있습니다:

[[ -z $(find /tmp | grep mpg) ]]  # Use grep -q instead
a >> log; b >> log; c >> log      # Use a redirection block instead
echo "The time is `date`"         # Use $() instead
cd dir; process *; cd ..;         # Use subshells instead
echo $[1+2]                       # Use standard $((..)) instead of old $[]
echo $(($RANDOM % 6))             # Don't use $ on variables in $((..))
echo "$(date)"                    # Useless use of echo
cat file | grep foo               # Useless use of cat

데이터 및 입력 오류

ShellCheck는 데이터 및 입력과 관련된 문제를 인식할 수 있습니다.

args="$@"                         # Assigning arrays to strings
files=(foo bar); echo "$files"    # Referencing arrays as strings
declare -A arr=(foo bar)          # Associative arrays without index
printf "%s\n" "Arguments: $@."    # Concatenating strings and arrays
[[ $# > 2 ]]                      # Comparing numbers as strings
var=World; echo "Hello " var      # Unused lowercase variables
echo "Hello $name"                # Unassigned lowercase variables
cmd | read bar; echo $bar         # Assignments in subshells
cat foo | cp bar                  # Piping to commands that don't read
printf '%s: %s\n' foo             # Mismatches in printf argument count
eval "${array[@]}"                # Lost word boundaries in array eval
for i in "${x[@]}"; do ${x[$i]}   # Using array value as key

견고성

ShellCheck는 스크립트의 견고성을 개선하기 위한 제안을 할 수 있습니다.

rm -rf "$STEAMROOT/"*            # Catastrophic rm
touch ./-l; ls *                 # Globs that could become options
find . -exec sh -c 'a && b {}' \; # Find -exec shell injection
printf "Hello $name"             # Variables in printf format
for f in $(ls *.txt); do         # Iterating over ls output
export MYVAR=$(cmd)              # Masked exit codes
case $version in 2.*) :;; 2.6.*) # Shadowed case branches

휴대성

ShellCheck는 shebang에서 지원하지 않는 기능을 사용할 때 경고합니다. 예를 들어, shebang을 #!/bin/sh로 설정하면 ShellCheck는 checkbashisms와 유사한 이식성 문제에 대해 경고합니다.

echo {1..$n}                     # Works in ksh, but not bash/dash/sh
echo {1..10}                     # Works in ksh and bash, but not dash/sh
echo -n 42                       # Works in ksh, bash and dash, undefined in sh
expr match str regex             # Unportable alias for `expr str : regex`
trap 'exit 42' sigint            # Unportable signal spec
cmd &> file                      # Unportable redirection operator
read foo < /dev/tcp/host/22      # Unportable intercepted files
foo-bar() { ..; }                # Undefined/unsupported function name
[ $UID = 0 ]                     # Variable undefined in dash/sh
local var=value                  # local is undefined in sh
time sleep 1 | sleep 5           # Undefined uses of 'time'

기타

ShellCheck는 다음과 같은 다양한 문제를 인식합니다.

PS1='\e[0;32m\$\e[0m '            # PS1 colors not in \[..\]
PATH="$PATH:~/bin"                # Literal tilde in $PATH
rm “file”                         # Unicode quotes
echo "Hello world"                # Carriage return / DOS line endings
echo hello \                      # Trailing spaces after \
var=42 echo $var                  # Expansion of inlined environment
!# bin/bash -x -e                 # Common shebang errors
echo $((n/180*100))               # Unnecessary loss of precision
ls *[:digit:].txt                 # Bad character class globs
sed 's/foo/bar/' file > file      # Redirecting to input
var2=$var2                        # Variable assigned to itself
[ x$var = xval ]                  # Antiquated x-comparisons
ls() { ls -l "$@"; }              # Infinitely recursive wrapper
alias ls='ls -l'; ls foo          # Alias used before it takes effect
for x; do for x; do               # Nested loop uses same variable
while getopts "a" f; do case $f in "b") # Unhandled getopts flags

추천사

처음에는 "shellcheck가 최고야"라고 생각하지만 그다음에는 "뭐야, 아직도 bash를 쓰고 있는 거야?"라고 생각하게 됩니다.

알렉산더 타라시코프, 트위터를 통해


문제 무시

문제는 환경 변수, 명령줄, 개별적으로 또는 파일 내에서 전역적으로 무시할 수 있습니다.

https://github.com/koalaman/shellcheck/wiki/Ignore


버그 보고

버그나 기능 제안 사항이 있으면 GitHub 문제 추적기를 사용하세요.

https://github.com/koalaman/shellcheck/issues


기여하기

GitHub 풀 리퀘스트에 코드나 문서에 대한 패치를 제출하세요! 확인 DevGuide를 참조하세요. 쉘체크 위키.

기여물은 GNU GPLv3 라이선스에 따라 사용되어야 합니다. 저작권은 기여자에게 있습니다.


저작권

ShellCheck는 GNU General Public License, v3에 따라 라이센스가 부여됩니다. 이 라이센스 사본은 LICENSE 파일에 포함되어 있습니다.

저작권 2012-2019, Vidar 'koala_man' Holen 및 기여자.

즐거운 ShellChecking을 즐겨보세요!


기타 리소스

  • 위키에는 각 경고에 대한 긴 형식의 설명이 있습니다(예: SC2221.
  • ShellCheck는 어떤 종류의 서식이나 들여쓰기 스타일도 강제로 적용하려고 하지 않으므로 shfmt도 확인해 보세요!
728x90
반응형
반응형

shc : 리눅스 쉘 스크립트 컴파일러

일반 셸 스크립트 컴파일러.

shc는 명령줄에 지정된 스크립트를 가져와 C 소스 코드를 생성합니다. 생성된 소스 코드는 컴파일되어 링크되어 스트립된 바이너리 실행 파일생성합니다.

컴파일된 바이너리는 여전히 쉘 코드의 첫 번째 줄에 지정된 쉘(즉, shebang)에 종속됩니다(즉, #!/bin/sh). 따라서 shc는 완전히 독립적인 바이너리를 생성하지 않습니다.

shc 자체는 cc와 같은 컴파일러가 아니라 셸 스크립트를 인코딩하고 암호화하여 만료 기능이 추가된 C 소스 코드를 생성합니다. 그런 다음 시스템 컴파일러를 사용하여 원래 스크립트와 정확히 동일하게 동작하는 스트립된 바이너리를 컴파일합니다. 실행 시 컴파일된 바이너리는 셸 -c 옵션으로 코드를 해독하고 실행합니다.

설치

./configure
make
sudo make install

참고 automake 버전으로 인해 make가 실패하는 경우, 위 명령을 실행하기 전에 ./autogen.sh를 실행하세요.

Ubuntu 전용

sudo add-apt-repository ppa:neurobin/ppa
sudo apt-get update
sudo apt-get install shc

위의 설치 방법이 너무 번거롭다면 릴리스 페이지에서 컴파일된 바이너리 패키지를 다운로드하고 shc 바이너리를 /usr/bin에 복사하고 shc.1 파일을 /usr/share/man/man1에 복사하세요.

사용법

shc [options]
shc -f script.sh -o binary
shc -U -f script.sh -o binary # Untraceable binary (prevent strace, ptrace etc..)
shc -H -f script.sh -o binary # Untraceable binary, does not require root (only bourne shell (sh) scripts with no parameter)

경화(hardening) 플래그 -H

이 플래그는 현재 실험 상태이며 모든 시스템에서 작동하지 않을 수 있습니다. 이 플래그는 기본 셸에서만 작동합니다. 예를 들어, -H 플래그로 bash 스크립트를 컴파일하면 결과 실행 파일은 기본 셸이 bash인 시스템에서만 작동합니다. 일반적으로 /bin/sh인 기본 셸을 변경할 수 있으며, 이는 bash 또는 dash 등과 같은 다른 셸에 대한 링크일 뿐입니다.

또한 -H는 위치 매개변수와 함께 작동하지 않습니다(아직은)

테스트

./configure
make
make check

알려진 제한 사항

shc를 사용할 때의 유일한 제한 사항은 _SC_ARG_MAX 시스템 구성 매개변수입니다. 이는 exec 함수의 인수의 최대 길이를 제한하여 shc의 실행 가능한 스크립트의 최대 길이를 제한합니다.

Note

!! - 사용하기 전에 결과를 주의 깊게 확인하세요 - !!

링크

  1. Man 페이지
  2. 웹 페이지

기여하기

풀 리퀘스트를 만들고 싶다면, master 브랜치에 대해 하세요. 기본 브랜치는 release이며, 사용할 준비가 된 깨끗한 패키지 파일을 포함해야 합니다.

매뉴얼을 편집하려면 man.md 파일(마스터 브랜치에서 사용 가능)을 편집한 다음 다음 명령을 사용하여 해당 파일에서 매뉴얼 파일을 생성하세요(pandoc 설치 필요):

pandoc -s man.md -t man -o shc.1
#also run this command to generate the html manual
pandoc -s man.md -t html -o man.html

autotools와 관련된 것을 변경한 경우에는 나중에 ./autogen.sh를 실행하세요.

728x90
반응형
반응형

Windows Terminal에 색 구성표를 추가하는 방법

Windows Terminal에 색 구성표를 추가하려면 다음 단계를 따르시면 됩니다:

  1. Windows Terminal 설정 열기:

    • Windows Terminal을 열고, 오른쪽 상단의 드롭다운 메뉴(화살표 모양)를 클릭한 후 "설정"을 선택합니다.
  2. 설정 파일 열기:

    • 설정 창에서 왼쪽 메뉴에 있는 "설정 파일 열기" 버튼을 클릭하여 settings.json 파일을 엽니다.
  3. 색 구성표 추가:

    • settings.json 파일에서 "schemes" 항목을 찾습니다. 이 항목이 없을 경우 추가하셔야 합니다. 예시는 다음과 같습니다:
    "schemes": [
        {
            "name": "MyCustomScheme",
            "background": "#1E1E1E",
            "foreground": "#C0C0C0",
            "black": "#000000",
            "red": "#FF0000",
            "green": "#00FF00",
            "yellow": "#FFFF00",
            "blue": "#0000FF",
            "purple": "#800080",
            "cyan": "#00FFFF",
            "white": "#FFFFFF",
            "brightBlack": "#808080",
            "brightRed": "#FF8080",
            "brightGreen": "#80FF80",
            "brightYellow": "#FFFF80",
            "brightBlue": "#8080FF",
            "brightPurple": "#FF80FF",
            "brightCyan": "#80FFFF",
            "brightWhite": "#FFFFFF"
        }
    ],
  4. 프로파일에 적용:

    • 원하는 프로파일(예: cmd, PowerShell)에 방금 추가한 색 구성표를 적용하려면, "profiles" 섹션에서 특정 프로파일에 "colorScheme": "MyCustomScheme" 항목을 추가합니다.
  5. 저장 및 재시작:

    • settings.json 파일을 저장하고 Windows Terminal을 다시 시작하면 새로 추가한 색 구성표가 적용됩니다.

이렇게 하면 색 구성표를 직접 추가하고 적용할 수 있습니다.

728x90
반응형
반응형

bash 현재 경로를 윗 줄에 표시

  • PS1 변수를 .bashrc 등에 다음과 같이 설정
PS1='\n\[\e[37;40m\]\w\[\e[0m\]\n\$ '
  • 현재 경로가 ~/workspace 인 경우, 다음과 같이 표시됨
~/workspace
$
728x90
반응형
반응형

bash prompt 흰 글자, 검은 배경

설정 방법

  • 다음 내용을 ~/.bashrc에 넣는다. PS1 설정이 이미 있는 경우, 대체한다.
PS1='\n\[\e[37;40m\]\w\[\e[0m\]\n\$ '
728x90
반응형
반응형

[리눅스 linux 쉘 shell bash] 모든 로그를 표시 않하는 방법

hello.sh > /dev/null 2>&1
  • 스크립트 의미

    • hello.sh에서 실행 되는 결과 중, 일반출력(stdout) 및 오류출력(stderr)을 포함한 모든 정보를 표시하지 않음
  • 혹시 도움이 되셨다면 공감 ❤️ 한번 눌러 주세요. 감사합니다. https://j2doll.tistory.com/733

728x90
반응형

+ Recent posts