Program Tip

명령 결과를 bash에서 인수로 사용합니까?

programtip 2020. 12. 1. 19:36
반응형

명령 결과를 bash에서 인수로 사용합니까?


폴더의 모든 음악에 대한 재생 목록을 만들려면 bash에서 다음 명령을 사용합니다.

ls > list.txt

재생 목록 이름으로 pwd (작업 디렉터리 인쇄) 명령 의 결과를 사용하고 싶습니다 .

다음과 같은 것 :

ls > ${pwd}.txt

그래도 작동하지 않습니다-누구든지 이와 같은 작업을 수행하기 위해 사용해야하는 구문을 말할 수 있습니까?

편집 : 의견에서 언급했듯이 pwd는 절대 경로를 제공하므로 내 재생 목록은 일부 디렉토리에서 .txt라는 이름으로 끝납니다-d' oh! 그래서 경로를 다듬어야합니다. 찾아 주셔서 감사합니다. 파일이 어디로 갔는지 궁금해했을 것입니다.


이를 수행하는 가장 좋은 방법은 "$(command substitution)"(감사합니다, Landon ) :

ls > "$(pwd).txt"

때때로 사람들이 이전의 백틱 표기법을 사용하는 것을 볼 수 있지만 중첩 및 이스케이프 측면에서 몇 가지 단점 이 있습니다 .

ls > "`pwd`.txt"

의 처리되지 않은 대체 pwd는 절대 경로이므로 위 명령은 작업 디렉토리와 동일한 디렉토리에 이름이 같지만 확장자가있는 파일을 생성합니다 .txt. Thomas Kammeyer는 basename명령이 선행 디렉토리를 제거하므로 현재 디렉토리에 해당 디렉토리 이름으로 텍스트 파일이 생성 된다는 점을 지적했습니다 .

ls > "$(basename "$(pwd)").txt"

또한 경로의 공간 문제를 제기 한 erichui에게 감사드립니다.


이것은 backtick 솔루션과 동일합니다.

ls > $(pwd).txt

말 그대로 당신이 말한 것을하기 위해, 당신은 시도 할 수 있습니다 :

ls > `pwd`.txt

전체 경로 이름을 사용하므로 괜찮습니다. 홈 디렉토리 (/ home / hoboben에있을 수 있음)에서이 작업을 수행하면 위 디렉토리의 텍스트 파일 인 /home/hoboben.txt 생성을 시도하게됩니다.

이것이 당신이 원했던 것입니까?

디렉토리에 그 이름을 따서 명명 된 파일이 포함되도록하려면 현재 디렉토리의 기본 이름을 가져 와서 .txt를 pwd에 추가합니다.

이제 pwd 명령을 사용하는 대신 ... PWD 환경 변수를 사용하지 않는 이유는 무엇입니까?

예를 들면 :

ls > $PWD.txt

또는

ls > ${PWD}.txt

두 번째 예에서 기억하려고했던 것입니다.

/ home / hoboben에 있고 /home/hoboben/hoboben.txt를 만들려면 다음을 시도하십시오.

ls > ${PWD}/${PWD##*/}.txt

이렇게하면 파일에 자체 이름이 포함되므로 대부분의 경우 몇 가지 방법 중 하나로이 문제를 해결할 수 있습니다. -a 플래그를 사용하지 않는 한 (선택적으로 결과 파일의 이름을 변경하는 한) 다른 곳으로 리디렉션하고 파일을 이동하거나 점으로 시작하는 파일 이름을 ls 명령에서 숨길 수 있습니다.

음악 파일의 디렉토리 계층 구조를 관리하기위한 스크립트를 작성하고 ".info"라는 하위 디렉토리를 사용하여 예를 들어 일부 예비 파일에 트랙 데이터를 포함합니다 (기본적으로 메타 데이터를이 방식으로 "숨 깁니다"). 내 요구 사항이 간단하고 컬렉션이 작기 때문에 괜찮습니다.


문제는 디렉토리 이름 중 하나에 공백이 있다는 것입니다. 예를 들어 작업 디렉토리가 "/ home / user / music / artist name"인 경우. Bash는 / home / user / music / artist 및 name.txt로 리디렉션하려고한다고 생각하면 혼란 스러울 것입니다. 큰 따옴표로이 문제를 해결할 수 있습니다.

ls > "$(pwd).txt"

또한 $ (pwd) .txt로 리디렉션하지 않을 수도 있습니다. 위의 예에서 출력을 "/ home / user / music / artist name.txt"파일로 리디렉션합니다.


구문은 다음과 같습니다.

ls > `pwd`.txt

그것은 일반적인 작은 따옴표가 아니라 '~'아래에있는 '`'문자입니다.


위의 방법을 사용하면 현재 디렉토리보다 한 수준 위에 파일이 생성됩니다. 재생 목록이 모두 하나의 디렉토리로 이동하려면 다음과 같이해야합니다.

#!/bin/sh

MYVAR=`pwd | sed "s|/|_|g"`
ls > /playlistdir/$MYVAR-list.txt

디렉토리 이름을 제외한 모든 것을 제거하려면

ls >/playlistdir/${PWD##/*}.txt

this is probably not what you want because then you don't know where the files are (unless you change the ls command)

to replace "/" with "_"

ls >/playlistdir/${PWD//\//_}.txt

but then the playlist would look ugly and maybe not even fit in the selection window

So this will give you both a short readable name and usable paths inside the file

ext=.mp3 #leave blank for all files
for FILE in "$PWD/*$ext"; do echo "$FILE";done >/playlistdir/${PWD##/*}.txt

참고URL : https://stackoverflow.com/questions/58207/using-the-result-of-a-command-as-an-argument-in-bash

반응형