Поймите значение `$ _`

Вы можете найти хорошее руководство здесь: Keep Your SSH Session Running when You Disconnect

sudo apt-get install screen

Теперь вы можете начать новый сеанс экрана, просто набрав screen в командной строке. Вам будет показана некоторая информация об screen. Нажмите Enter, и вы окажетесь в обычном приглашении.

Чтобы отключиться (но оставить сеанс запущенным) Нажмите Ctrl + A, а затем Ctrl + D в мгновенной последовательности. Вы увидите сообщение [detached]

To reconnect to an already running session

screen -r

To reconnect to an existing session, or create a new one if none exists

screen -D -r

To create a new window within a running screen session. Нажмите Ctrl + A и затем C в мгновенной последовательности. Появится новое приглашение.

Для перехода от одного окна экрана к другому Нажмите Ctrl + A, а затем Ctrl + A последовательно.

Чтобы составить список открытых окон экрана Ctrl + A и затем W последовательно

9
02.05.2016, 00:03
3 ответа

Согласен, не очень понятно.

1. При запуске оболочки

  • , если переменная _ находилась в среде, которую bash получил , то bash не затрагивает ее.

    В частности, если оболочка bash была вызвана другой оболочкой bash (хотя zsh , yash и некоторые реализации ksh также делают это), тогда оболочка bash установит для переменной среды _ значение путь выполняемой команды (это третья точка в вашем вопросе). Например, если bash вызывается для интерпретации сценария в результате интерпретации другой bash оболочки:

     bash-script некоторые аргументы 
     

    Этот bash будет передавать _ = / path / to / bash-scrip в среде , заданной для bash-script , и таким будет начальное значение переменной $ _ bash в оболочке bash , которая интерпретирует этот сценарий.

     $ env -i _ = something bash -c 'echo "$ _"' 
    что угодно 
     
  • Итак, , если вызывающее приложение не передает _ окружения переменная , вызываемая оболочка bash инициализирует $ _ в argv [0] , который он получает , который может быть bash , или / path / to / bash или / path / to / some-script или что-нибудь еще (в приведенном выше примере это было бы / bin / bash , если бы она была #! / bin / bash {{ 1}} или / путь / к / bash-скрипту в зависимости от системы ).

    Таким образом, этот текст вводит в заблуждение, поскольку он описывает поведение вызывающей стороны , которую bash не может контролировать. Приложение, вызвавшее bash , вполне может вообще не устанавливать $ _ (на практике это делают только некоторые оболочки и несколько редких интерактивных приложений. , execlp () , например, не ), или он может использовать его для чего-то совершенно другого (например, ksh93 устанавливает его в * pid * / путь / к / команде ).

     $ env bash -c 'echo "$ _"' 
     / usr / bin / env (env не установил его как / bin / bash, поэтому мы 
    получаем один передан в env моей интерактивной оболочкой) 
     $ ksh93 -c 'bash -c "echo \ $ _"' 
     * 20042 * / bin / bash 
     

2 . Впоследствии

Впоследствии тоже не очень ясен. На практике это как только bash интерпретирует простую команду в текущей среде оболочки.

  • В случае интерактивной оболочки это будет первая простая команда, интерпретируемая, например, из /etc/bash.bashrc .

    Например, в приглашении интерактивной оболочки:

      $ echo "$ _" 
    ] (последний аргумент последней команды из моего ~ / .bashrc) 
     $ f () {эхо-тест; } 
     $ echo "$ _" 
    ] (в предыдущей командной строке не было простой команды, поэтому мы получаем 
    последний аргумент предыдущей командной строки echo) {{1} } $ (: test) 
     $ echo "$ _" 
    ] (простая команда, но в среде суб-оболочки) 
     $: test 
     $ echo "$ _" 
    test 
     
  • Для неинтерактивной оболочки это будет первая команда в $ BASH_ENV или код, введенный в эту shell, если $ BASH_ENV не установлен .

3. Когда Bash выполняет команду

Третий момент отличается от предыдущего и упоминается в обсуждении выше.

bash , как и некоторые другие оболочки, будет передавать переменную среды _ командам, которые он выполняет, которая содержит путь, который bash использовал в качестве первого аргумента для ] execve () системные вызовы.

$ env | grep '^_'
_=/usr/bin/env

4. При проверке почты

Четвертый пункт более подробно описан в описании переменной MAILPATH :

'MAILPATH'

Список разделенных двоеточиями имен файлов , которые оболочка периодически проверяет наличие новой почты .

Каждая запись списка может указывать сообщение, которое печатается при поступлении новой почты в почтовом файле , путем отделения имени файла от сообщения символом '?'. При использовании в тексте сообщения '$ _' заменяется именем текущего почтового файла.

Пример:

$ MAILCHECK=1 MAILPATH='/tmp/a?New mail in <$_>' bash
bash$ echo test >> /tmp/a
New mail in </tmp/a>
24
27.01.2020, 20:04

Попробуйте этот простой пример:

echo "$_"
echo "test"
echo "$_"

Запустите его, указав абсолютный путь ( /home/$USERNAME/test.sh ); вывод:

/home/$USERNAME/test.sh
test
test

Первый $ _ содержит путь, который вы использовали для вызова скрипта, а второй - первый аргумент среднего echo . Для третьего элемент в списке, если вы запустите новый терминал и наберете echo $ _ , он покажет переменную, содержащую ПУТЬ , которая обычно используется для поиска и вызова команд (на моем компьютере с Ubuntu) в обычной оболочке или по абсолютному пути к вашему файлу .bashrs в оболочке входа в систему.

Для четвертого элемента со страницы руководства bash:

При использовании в тексте сообщения $ _ заменяется именем текущего почтового файла .

7
27.01.2020, 20:04

Для случая 2 пример стоит тысячи слов:

mkdir my_long_dir
cd $_

Делает то, на что вы догадываетесь/надеетесь. Дает мне простой заполнитель, когда я нахожусь в командной строке, чтобы мне не приходилось повторяться.

5
27.01.2020, 20:04

Теги

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