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
lsto tylko przypadkowy przykład, oryginalny tekst może być dowolny. sedtakże przykład przekształcania tekstu. Ciekawe jest to sh. Piszczę wszystko, co mam, shi 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/stdinrzecz 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 .docpliki 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.