Есть способ Чтобы указать раздел конвейера «пройти через»?

В CentOS sshd (демон) обычно находится в / usr / sbin / sshd . В любом случае, вы можете узнать из RPM:

rpm -qil openssh-server | grep sshd
4
18.09.2018, 06:55
1 ответ

Во-первых, использование еще одного catна самом деле не имеет большого значения, и вы не должны беспокоиться об этом.

Во-вторых, команды, составляющие конвейер, в любом случае выполняются в отдельных процессах, независимо от того, являются ли они внешними командами или встроенными -встроенными:

$ a=0
$ a=1 | a=2 | a=3
$ echo $a
0

Что касается конкретно вашей проблемы, то невозможно просто соединить 'stdin' с 'stdout'; даже если в оболочке есть какая-то nopвстроенная функция, которая разрушится при использовании в конвейере (, например,| nop |-> |), оболочка не имеет возможности узнать заранее, во время установки конвейера, что ваш «коммутатор» переключится на nopвместо awkили sort.

Вы также можете добиться того же эффекта, что и при «переключателях», создав конвейер самостоятельно, а затем вызвав eval для его запуска. Пример:

$ cat test.sh
type=`file -zi "$1"`
case $type in
*application/gzip*)     mycat='zcat "$1"';;
*)                      mycat='cat "$1"';;
esac
case $type in
*charset=utf-16le*)     mycat="$mycat | iconv -f utf16le";;
esac
# highlight comments in blue
esc=`printf '\033'`;
mycat="$mycat | sed 's/^#.*/$esc[34m&$esc[m/'"
echo >&2 "$mycat"    # show the built pipeline
eval "$mycat"   #... and run it
$ iconv -t utf16 test.sh > test16.sh; gzip test16.sh
$ sh test.sh test16.sh.gz

Это немного не по -теме, но в Linux есть более быстрый способ скопировать стандартный ввод в стандартный вывод (, если какой-либо из них является каналом)--системный вызов splice(2), который не включает перемещение данных в пространство пользователя и из него:

$ cat splice_cat.c
#define _GNU_SOURCE
#include <fcntl.h>
#include <stdlib.h>
#include <err.h>

int main(int ac, char **av){
    ssize_t r;
    size_t block = ac > 1 ? strtoul(av[1], 0, 0) : 0x20000;
    for(;;)
            if((r = splice(0, NULL, 1, NULL, block, 0)) < 1){
                    if(r < 0) err(1, "splice");
                    return 0;
            }
}
$ cc -Wall splice_cat.c -o splice_cat
$ dd if=/dev/zero bs=1M count=100 status=none | (time cat >/dev/null)
real    0m0.153s
user    0m0.012s
sys     0m0.056s
$ dd if=/dev/zero bs=1M count=100 status=none | (time./splice_cat >/dev/null)
real    0m0.100s
user    0m0.004s
sys     0m0.020s

Однако (afaik ), это не используется ни оболочкой, ни cat, ddи т. д.

1
27.01.2020, 21:01

Теги

Похожие вопросы