Przepraszam za mylący tytuł!
Załóżmy, że biegnę
apt-cache depends kde-window-manager > ~/Desktop/kwin-depends
W folderze pulpitu otrzymam plik o nazwie „kwin-depends”.
Czy jest jakaś sztuczka, aby dołączyć polecenie, które wydałem jako część pliku, najlepiej na początku pliku?
Tak więc, przynajmniej w 14.04 LTS, kilka pierwszych linii wyglądałoby tak:
apt-cache depends kde-window-manager > ~/Desktop/kwin-depends
kde-window-manager
Depends: kde-runtime
Depends: libc6
|Depends: libegl1-mesa
Depends: <libegl1-x11>
Zamiast tego:
kde-window-manager
Depends: kde-runtime
Depends: libc6
|Depends: libegl1-mesa
Depends: <libegl1-x11>
command-line
bash
DK Bose
źródło
źródło
Odpowiedzi:
Chciałbym po prostu użyć prostej funkcji. Dodaj to do swojego
~/.bashrc
pliku:Teraz, gdy chcesz uruchomić polecenie i wydrukować je, możesz:
Powyżej tworzy ten plik:
źródło
apt-cache depends
doacd
otrzymuję „Brak polecenia«ACD»znaleziony, miałaś na myśli ...” gdy biegnęruncom acd leafpad > out
.ls
jest aliasowanyls --color=auto'
w rzeczywistości. Co można zrobić (o ile nie ma apostrofów lub cudzysłowów w swoim pseudonimem), to jest:$ terdonsFunction $(alias ls | awk -F '=' '{$1="";print}'| tr "'" " ")
.MYCOMMAND="apt-cache depends"; terdonsFunction $MYCOMMAND leafpad > out.txt
Możesz to zrobić:
Tej samej rzeczy używa się
echo
zamiast ciągów Here (<<<
):tee
napisze do STDOUT, a także do plikufile.txt
STDOUT
tee
ieapt-cache depends kde-window-manager
zostanie przekazanybash
do uruchomienia polecenia i dołączony do STDOUTfile.txt
.Przykład:
źródło
tee
ale mój ciągle zawodził. Dobra robota! +1tee
wydaje sięNajbardziej minimalistyczne - podejście nr 4 i nr 3, oba można przekształcić w funkcje; # 2 mój ulubiony -
awk
. # 1 używascript
polecenia - bardzo wszechstronnego narzędzia, przydatnego do nagrywania wiersza poleceń w ogóle; ma zastosowanie w dowolnym miejscu i do wszystkiego, co chcesz nagrać.Podejście nr 1: istnieje
/usr/bin/script
polecenie (domyślnie dostarczane z Ubuntu) do nagrywania danych wyjściowych z wiersza poleceń, które przechwytuje wszystko, wraz z monitem i poleceniem. Aby zapisać tylko jedno polecenie i jego wynik w określonym pliku, użyj-c
flagi i określ plik wyjściowy. PrzykładPodejście nr 2: hackery awk
Awk ma
system()
funkcję, która pozwala na uruchamianie poleceń powłoki zawk
skryptu lub polecenia . Wyjście pojawi się na ekranie, najpierw polecenie, następnie następne. Aby przekierować to, co widzisz, do>
operatora pliku, użyj .Można to zrobić na dwa sposoby - poproś użytkownika o wprowadzenie danych ze standardowego wejścia lub argumentu wiersza poleceń. Pierwszy jest łatwiejszy do osiągnięcia, stąd opublikowanie go.
(1)
awk 'BEGIN{ print "Enter command to run: "; getline com < "/dev/stdin"; system(com) }'
(2) Wersja argumentów linii poleceń; bez uwzględnienia danych wyjściowych, aby uniknąć zbyt długich odpowiedzi. Ponownie dołącz
>
do przekierowania do plikuPodejście nr 3: poproś bash o wykonanie pracy za ciebie
Przekieruj do pliku z
>
operatorem:bash -c ' MYCOMMAND="apt-cache depends gnome-terminal"; echo $MYCOMMAND ; $MYCOMMAND ' > output.txt
Podejście 4: (mój drugi ulubiony)
Zainspirowany postem ByteCommander; możemy użyć,
read
a następnie uruchomić niezbędne polecenia w podpowłocePrzykładowy przebieg:
Podejście nr 5:
Użyj
echo
lubhere string
(aka<<< "string"
), aby podać argumentysh -c
poprzezxargs
A jeśli chcesz, możesz użyć tej samej sztuczki z aliasem:
źródło
awk
naprawdę to bardzo konfigurowalny koleś, prawda? `skrypt wygląda również na przydatny do kilku innych zastosowań.script -q outputfile
outputfile
Przykład
Początek
script
Uruchom polecenie
Naciśnij Ctrl-D
Pokaż swoje polecenie i dane wyjściowe
i zobaczysz coś takiego
źródło
Jeśli chcesz rozwinąć alias (tylko bash), możesz to zrobić w ten sposób:
Możesz teraz biegać
źródło
Może być łatwiejszy sposób, ale możesz to zrobić za pomocą skryptu:
Utwórz plik
script
z tą zawartością w folderze domowym i zezwól na wykonanieUruchom to w ten sposób:
źródło
script.sh
zawsze tworzył plik o nazwiescript.log
wyjściowej.Niezwykle proste rozwiązanie wykorzystujące jednowierszową funkcję Bash
Przygotowanie:
To podejście wykorzystuje niestandardową funkcję bash, aby zapewnić pożądaną funkcjonalność. Zdefiniujesz go, wykonując następujący wiersz w sesji terminalu. pamiętaj, że możesz wybrać dowolną prawidłową nazwę zmiennej bash zamiast
runandlog
:To pozostaje jednak tylko dla bieżącej sesji Bash, co oznacza, że po zamknięciu okna terminala funkcja zniknie.
Jeśli jednak próbowałeś go lubić, możesz go zawsze udostępnić, edytując
~/.bashrc
plik i dołączając ten wiersz na końcu.Jak używać:
Po zdefiniowaniu funkcji możesz użyć jej do uruchamiania poleceń podczas rejestrowania zarówno samego polecenia, jak i jego wyniku w pliku. Możesz nawet dodać więcej informacji, takich jak użytkownik, który ją wykonał, które już zawarłem w funkcji, lub dokładny czas jej uruchomienia. Żądania funkcji w komentarzach są mile widziane! :)
Składnia jest prosta:
Przykład:
Przykładowa sesja jako użytkownik
bytecommander
działająca z katalogu domowego może wyglądać następująco:Co spowoduje powstanie nowego pliku
mylogfile
(jeśli już istnieje, funkcja doda do niego dane wyjściowe!) W bieżącym katalogu z zawartością:źródło
Dość niepewną, ale funkcjonalną sztuczką byłoby:
Brzydkie, ale działa!
źródło
Możesz po prostu przekazać polecenie do funkcji, która najpierw wydrukuje polecenie, a następnie jego wynik (przekierowania są celowo ukryte przed wydrukowanym poleceniem, możesz to łatwo zmienić, usuwając cudzysłowy z polecenia i drukując i uruchamiając je
$@
zamiast tego o$1
w funkcji)Aby dodać polecenie później, możesz uruchomić to polecenie, które wstawi ostatnie uruchomienie polecenia u góry pliku:
<<<"[...]"
: tutaj ciąg;[...]
jest przekierowany nacat
'sstdin
;$(<foo)
: podstawienie polecenia; zostało zastąpione treścią „foo”;cat [...] - >foo
: Łączystdin
do[...]
i wyjścia z „foo”;<([...])
: podstawienie procesu: jest zastąpione deskryptorem pliku zawierającym dane wyjściowe[...]
;history 2 | sed -n '1s/ [0-9][0-9]* \(.*\)/\1\n/p'
: wypisuje dwie ostatnie komendy, usuwa dwie spacje, po których następuje jedna lub więcej cyfr, a następnie dwie spacje z pierwszego wiersza i wypisuje je;źródło
$1
? I nie ma takiej potrzebyeval
.eval
nie jest potrzebne, nie jestem pewien, dlaczego dodałem go wcześniej. Dzięki.