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!
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.
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
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.
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 "
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.
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
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
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