Intereting Posts
Недопустимое присвоение zsh в функции канала gzip, bzip2 и zip: очень низкая степень сжатия Сортировка файла CSV, но не его заголовок как сделать LVM доступным для загрузки? kernel panic – dracut не может найти логические тома после обновления ядра в CentOS 6.6 OpenVPN GUI, избегайте маршрутизации всего интернет-трафика через VPN Как реплицировать установленный пакет из одного экземпляра Fedora в другой? `rm` подсказка при предоставлении более одного файла что означают числа в команде show ip rule show установить python 3.6 из исходного кода, теперь dpkg запутался simplescreenrecorder в ubuntu: звук не ясен Как использовать wget или другой инструмент для загрузки файла, для которого ссылка скрыта (активируется только при щелчке) Как читать температуру процессора на общем сервере? Является ли реализация Linux конфигурации «переменной» ARG_MAX отличной от других системных переменных и совместима ли она с POSIX? Как я могу запустить это в фоновом режиме и запустить 5 экземпляров? как заставить gnome использовать мою домашнюю папку в качестве папки рабочего стола?

Подавлять сообщения о запуске на stdout?

Я использую tcsh и должен .cshrc файл .cshrc группы. Этот файл передает некоторые сообщения, что отлично подходит для обычных оболочек, но вызывает проблемы с такими программами, как scp и rsync . Я вижу решение, принимающее одну из нескольких форм, но я не могу реализовать ни один из них.

Выполнять эхо, если это необходимо

Я tcsh страницы rsync и tcsh man, но я не могу найти никаких переменных, которые гарантированно будут установлены или отменены, когда он вызывается из ssh / rsync / whatever. $PROMPT – это то же самое, что и обычный, $shlvl равно 1, и ничто другое не выглядит многообещающим.

Перенаправление на stderr

rsync / scp / etc, похоже, не заботятся о том, что происходит с stderr, поэтому, если бы я мог, я бы

 echo $MSG >&2 

Но это не работает даже из оболочки. Вместо этого он записывает $MSG в файл с именем 2 . Когда я просматриваю историю, кажется, что что-то (xterm? Readline? Tcsh?) – это вставка пробелов, так что на самом деле было выполнено

 echo $MSG > & 2 

Таким образом, наблюдаемое поведение имеет смысл, учитывая фактический вклад в tcsh.

Перенаправление в / dev / stderr

Я тоже пробовал

 echo $MSG > /dev/stderr 

Что работает для ssh , но для scp и rsync я получаю сообщение ' /dev/stderr: Permission denied. 'и ключевое различие, по-видимому, заключается в том, где файл символически связан. Добавление ls -l /dev/stderr /proc/self/fd/2 в файл cshrc показывает

 # For ssh lrwxrwxrwx 1 root root 15 Apr 11 09:58 /dev/stderr -> /proc/self/fd/2 lrwx------ 1 <me> <mygrp> 64 May 24 14:34 /proc/self/fd/2 -> /dev/pts/6 # For scp lrwxrwxrwx 1 root root 15 Apr 11 09:58 /dev/stderr -> /proc/self/fd/2 l-wx------ 1 <me> <mygrp> 64 May 24 15:07 /proc/self/fd/2 -> pipe:[378204842] 

Тем не менее, поскольку сообщение о разрешении отклонено на stderr, процесс scp / rsync способен выполнять свою задачу, поэтому я могу жить с этим решением, но скорее не получаю это ложное сообщение об ошибке.

Идиома, которую я использую,

 if ( $?prompt ) then # interactive commands here endif 

обратите внимание, что в нем написано $prompt (строчный), а не $PROMPT .

 % echo $prompt %U%m%u:%B%~%b%# % ssh localhost 'echo $prompt' Warning: Permanently added 'localhost' (RSA) to the list of known hosts. Password: prompt: Undefined variable. 

Если $prompt всегда задан, то один из ваших файлов запуска может быть установлен безоговорочно.

Он должен войти в тест if ( $?prompt ) , например,

 if ( $?prompt ) then set prompt='%B%m%b %C3>' # interactive commands here endif 

Тестирование, если вывод является терминалом, может также работать.

 if ({ test -t 0 }) then # interactive commands here endif