Jednym z problemów z pierwszym poleceniem jest przekierowanie stderr do miejsca, w którym znajduje się stdout (jeśli zmieniłeś $ na a & zgodnie z sugestią w komentarzu), a następnie przekierowałeś stdout do jakiegoś pliku dziennika, ale to nie pociąga za sobą przekierowanego stderr . Musisz to zrobić w innej kolejności, najpierw wyślij stdout tam, gdzie chcesz, a następnie wyślij stderr na adres stdout pod adresem
some_cmd > some_file 2>&1 &
a następnie możesz włączyć i włączyć, aby wysłać go w tło. Do zadań można uzyskać dostęp za pomocą jobspolecenia. jobspokaże bieżące zadania i numeruje je. Następnie możesz porozmawiać o zadaniach, używając%, a następnie liczby kill %1lub więcej.
Ponadto bez znaku & na końcu możesz zawiesić polecenie za Ctrlzpomocą bgpolecenia, aby umieścić je w tle i fgprzenieść z powrotem na pierwszy plan. W połączeniu z jobspoleceniem jest to potężne.
aby wyjaśnić powyższą część dotyczącą kolejności pisania poleceń. Załóżmy, że stderr to adres 1002, stdout to adres 1001, a plik to 1008. Polecenie czyta od lewej do prawej, więc pierwszą rzeczą, którą widzi w twoim, jest 2>&1przesunięcie stderr na adres 1001, a następnie sprawdzenie, > filektóry ruch stdout do 1008, ale utrzymuje stderr na 1001. Nie wyciąga wszystkiego wskazującego na 1001 i nie przenosi go do 1008, ale po prostu odwołuje się do stdout i przenosi go do pliku.
Odwrotnie, przesuwa stdout na 1008, a następnie przesuwa stderr do punktu, na który wskazuje stdout, 1008. W ten sposób oba mogą wskazywać na pojedynczy plik.
2>$1prawdopodobnie ma być2>&1.