Doskonale znam narzędzie source
(aka .
), które pobierze zawartość z pliku i uruchomi ją w bieżącej powłoce.
Teraz przekształcam tekst w polecenia powłoki, a następnie uruchamiam je w następujący sposób:
$ ls | sed ... | sh
ls
to tylko przypadkowy przykład, oryginalny tekst może być dowolny. sed
także przykład przekształcania tekstu. Ciekawe jest to sh
. Piszczę wszystko, co mam, sh
i to działa.
Mój problem polega na tym, że oznacza to uruchomienie nowej podpowłoki. Wolałbym, aby polecenia były uruchamiane w mojej obecnej powłoce. Jakbym był w stanie zrobić source some-file
, gdybym miał polecenia w pliku tekstowym.
Nie chcę tworzyć pliku tymczasowego, ponieważ jest brudny.
Alternatywnie, chciałbym rozpocząć moją subpowłokę z dokładnie takimi samymi cechami, jak moja obecna powłoka.
aktualizacja
Ok, rozwiązania korzystające z backticka z pewnością działają, ale często muszę to robić, gdy sprawdzam i zmieniam dane wyjściowe, więc wolałbym, aby istniał sposób, aby ostatecznie przekuć wynik na coś.
smutna aktualizacja
Ach, /dev/stdin
rzecz wyglądała tak ładnie, ale w bardziej złożonym przypadku nie działała.
Więc mam to:
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/git mv -f $1 $2.doc/i' | source /dev/stdin
Co zapewnia, że wszystkie .doc
pliki mają małe litery rozszerzenia.
I z którym, nawiasem mówiąc, można sobie poradzić xargs
, ale nie o to chodzi.
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/$1 $2.doc/i' | xargs -L1 git mv
Więc kiedy uruchomię ten pierwszy, od razu się zamknie, nic się nie dzieje.