Używanie wyniku polecenia jako argumentu w bash?

Aby utworzyć listę odtwarzania dla całej muzyki w folderze, używam następującego polecenia w bash:

ls > list.txt

Chciałbym użyć wyniku polecenia pwd dla nazwy listy odtwarzania.

Coś w stylu:

ls > ${pwd}.txt

To jednak nie działa - czy ktoś może mi powiedzieć, jakiej składni muszę użyć, aby zrobić coś takiego?

Edit: Jak wspomniano w komentarzach pwd będzie dawał absolutną ścieżkę, więc moja playlista będzie nazwane .txt w jakimś katalogu-d ' Oh! Więc będę musiał przyciąć ścieżkę. Dzięki za Zauważenie tego - prawdopodobnie spędziłbym wieki zastanawiając się, gdzie poszły moje pliki!

Author: Enlico, 2008-09-12

7 answers

Najlepszym sposobem na to jest "$(command substitution)" (dzięki, Landon):

ls > "$(pwd).txt"

Czasami zobaczysz, że ludzie używają starszej notacji backtick, ale ma to kilka wad pod względem zagnieżdżania i ucieczki:

ls > "`pwd`.txt"

Zauważ, że nieprzetworzone podstawienie pwd jest ścieżką bezwzględną, więc powyższe polecenie tworzy plik o tej samej nazwie w tym samym katalogu co katalog roboczy, ale z rozszerzeniem .txt. Thomas Kammeyer zauważył, że basename polecenie usuwa katalog wiodący, aby utworzyć plik tekstowy w bieżącym katalogu o nazwie tego katalogu:

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

Również podziękowania dla erichui za poruszenie problemu przestrzeni na ścieżce.

 83
Author: John Calsbeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 18:51:31

Jest to równoważne rozwiązaniu backtick:

ls > $(pwd).txt
 7
Author: Landon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-12 02:57:52

Aby zrobić dosłownie to, co powiedziałeś, możesz spróbować:

ls > `pwd`.txt

Który użyje pełnej ścieżki, co powinno być w porządku. Zauważ, że jeśli zrobisz to w swoim katalogu domowym, co może bądź w /home / hoboben, będziesz próbował utworzyć / home / hoboben.txt, plik tekstowy w katalogu powyżej.

Tego chciałeś?

Jeśli chcesz, aby Katalog zawierał plik nazwany jego imieniem, otrzymasz nazwę bazową bieżącego katalogu i dopisać do niego .txt do pwd.

Teraz, zamiast używać komendy pwd... dlaczego nie użyć zmiennej środowiskowej PWD?

Na przykład:

ls > $PWD.txt

Lub

ls > ${PWD}.txt

To prawdopodobnie to, co starałeś się zapamiętać na swoim drugim przykładzie.

Jeśli jesteś w/home / hoboben i chcesz utworzyć / home / hoboben / hoboben.txt, spróbuj:

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

Jeśli to zrobisz, plik będzie zawierał własną nazwę, więc najczęściej naprawisz to na jeden z kilku sposobów. Można przekierować w inne miejsce i przenieś plik lub nazwę pliku rozpoczynającego się kropką, aby ukryć go przed poleceniem LS, o ile nie użyjesz flagi-a (a następnie opcjonalnie Zmień nazwę pliku wynikowego).

Piszę własne skrypty do zarządzania hierarchią katalogów plików muzycznych i używam podkatalogów o nazwie". info", na przykład, aby zawierać dane ścieżek w niektórych zapasowych plikach (zasadniczo "ukrywam" metadane w ten sposób). To działa dobrze, ponieważ moje potrzeby są proste, a moja kolekcja mała.

 6
Author: Thomas Kammeyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-12 03:05:20

Podejrzewam, że problem może być taki, że w jednym z katalogów znajdują się spacje. Na przykład, jeśli katalog roboczy to "/ home/user/music / artist name". Bash będzie zdezorientowany myśląc, że próbujesz przekierować do /home/user/music / artist and name.txt. Możesz to naprawić za pomocą podwójnych cudzysłowów

ls > "$(pwd).txt"

Możesz również nie chcieć przekierowywać do $(pwd).txt. W powyższym przykładzie nastąpi przekierowanie wyjścia do pliku " / home/user/music / artist name.txt "

 5
Author: erichui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-12 02:59:47

Składnia jest następująca:

ls > `pwd`.txt

To znak "'Pod'~', a nie zwykły pojedynczy cytat.

 4
Author: John Meagher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-12 02:42:57

Użycie powyższej metody spowoduje utworzenie plików jeden poziom powyżej bieżącego katalogu. Jeśli chcesz, aby wszystkie listy odtwarzania trafiły do jednego katalogu, musisz zrobić coś w stylu:

#!/bin/sh

MYVAR=`pwd | sed "s|/|_|g"`
ls > /playlistdir/$MYVAR-list.txt
 1
Author: Mark Nold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-12 02:53:57

Aby usunąć wszystkie oprócz nazwy katalogu

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

To prawdopodobnie nie jest to, czego chcesz, ponieważ wtedy nie wiesz, gdzie są pliki (chyba że zmienisz polecenie ls)

Aby zastąpić " / "przez" _ "

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

Ale wtedy playlista wyglądałaby brzydko i może nawet nie zmieściłaby się w oknie wyboru

Więc to da ci zarówno krótką czytelną nazwę, jak i użyteczne ścieżki wewnątrz pliku

ext=.mp3 #leave blank for all files
for FILE in "$PWD/*$ext"; do echo "$FILE";done >/playlistdir/${PWD##/*}.txt
 0
Author: technosaurus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-06 18:29:57