Почему echo $$ возвращает число?

Ваш внешний диск, скорее всего, отформатирован NTFS или FAT32. Эти файловые системы не поддерживают разрешения файлов Linux.

У вас есть по крайней мере пять параметров:

Просто скопируйте его на рабочий стол (или в свою домашнюю папку) и установите разрешения для этого файл. Сохраните данные на нем и переформатируйте диск в файловую систему ext4. Это можно сделать с помощью Disk Utility или GParted. Выполнить файл с помощью программы, открыть терминал и запустить: для сценариев Bash: bash /path/to/your/file.sh для скриптов Python: python /path/to/your/file.py для скриптов Perl: perl /path/to/your/file.pl для исполняемых файлов Windows: wine /path/to/your/file.exe для 32-битных двоичных файлов: /lib/ld-linux.so.2 /path/to/your/file для 64-разрядных двоичных файлов: /lib/ld-linux-x86-64.so.2 /path/to/your/file Скопируйте файл на компьютер (например, домашнюю папку), установите бит выполнения и запустите его. (это не может быть сделано для всех файлов) (возможно, опасно). Установите раздел с битом выполнения, установленным для всех файлов. Для этого выполните следующие действия: Установите раздел (например, открыв его в браузере файлов). Откройте терминал и запустите:
sudo mount -o remount,fmask=027 /media/YOURDRIVE
Если вы не можете писать / получать доступ к файлам, запустите команду с ,uid=$(id -u) после fmask=022 :
sudo mount -o remount,fmask=027,id=$(id -u) /media/YOURDRIVE
«Возможно, опасно», потому что вы предоставляете разрешения на выполнение для всех файлов, используйте этот параметр только в том случае, если другие методы не работают.
6
задан 25 August 2017 в 18:41

9 ответов

Конвенция.

$$: Расширяется до идентификатора процесса оболочки. В () подоболочке она расширяется до идентификатора процесса вызывающей оболочки, а не подоболочки (см. Ссылку на руководство ниже).

rinzwind@schijfwereld:~$ echo $$
3244
rinzwind@schijfwereld:~$ ps -ef |grep 3244
rinzwind  3244  3237  0 19:06 pts/0    00:00:00 /bin/bash

Очень полезно при программировании программного обеспечения. И он может использоваться как грубый (mktemp был бы лучшим способом) способ создания временных файлов

1 $ не имеет особого значения, поэтому он дает вам то, что всегда делает эхо: верните его.

Для этого есть страница руководства (3.4.2 Специальные параметры).

18
ответ дан 22 May 2018 в 19:42
  • 1
    Почему echo $$$$ возвращает другой номер? – NerdOfLinux 7 August 2017 в 20:11
  • 2
    @NerdOfLinux возвращает один и тот же номер дважды – Ravexina 7 August 2017 в 20:11
  • 3
    @NerdOfLinux это не так? Он показывает то же число 2 раза – Rinzwind 7 August 2017 в 20:12
  • 4
    @MontyHarder: Предсказуемые имена (например, /tmp/myscript.$$) для файлов tmp обычно являются уязвимостью безопасности. См. linuxsecurity.com/content/view/115462/151 , почему mktemp - правильный путь, если вы не можете избежать необходимости в файле tmp в первую очередь. Включение PID вашего скрипта в шаблон mktemp является хорошей идеей, однако, по той причине, о которой вы указываете. – Peter Cordes 8 August 2017 в 03:18
  • 5
    «Очень полезно, когда программное обеспечение для кодирования: ps -ef | grep $$. " - Это довольно часто дает ложные срабатывания. – hvd 8 August 2017 в 20:21

Конвенция.

$$: Расширяется до идентификатора процесса оболочки. В () подоболочке она расширяется до идентификатора процесса вызывающей оболочки, а не подоболочки (см. Ссылку на руководство ниже).

rinzwind@schijfwereld:~$ echo $$ 3244 rinzwind@schijfwereld:~$ ps -ef |grep 3244 rinzwind 3244 3237 0 19:06 pts/0 00:00:00 /bin/bash

Очень полезно при программировании программного обеспечения. И он может использоваться как грубый (mktemp был бы лучшим способом) способ создания временных файлов

1 $ не имеет особого значения, поэтому он дает вам то, что всегда делает эхо: верните его.

Для этого есть страница руководства (3.4.2 Специальные параметры).

18
ответ дан 18 July 2018 в 08:55

Конвенция.

$$: Расширяется до идентификатора процесса оболочки. В () подоболочке она расширяется до идентификатора процесса вызывающей оболочки, а не подоболочки (см. Ссылку на руководство ниже).

rinzwind@schijfwereld:~$ echo $$ 3244 rinzwind@schijfwereld:~$ ps -ef |grep 3244 rinzwind 3244 3237 0 19:06 pts/0 00:00:00 /bin/bash

Очень полезно при программировании программного обеспечения. И он может использоваться как грубый (mktemp был бы лучшим способом) способ создания временных файлов

1 $ не имеет особого значения, поэтому он дает вам то, что всегда делает эхо: верните его.

Для этого есть страница руководства (3.4.2 Специальные параметры).

18
ответ дан 24 July 2018 в 19:12

В bash для использования с использованием переменной мы используем $, используя $$ с первым знаком доллара, мы говорим, что я хочу использовать переменную и используя вторую, мы говорим, что имя этой переменной фактически $. это действительно соглашение об именах, и эта переменная содержит идентификатор процесса текущей оболочки.

Как вы просили в комментариях с $$$$, вы дважды возвращаете один и тот же идентификатор процесса.

Существуют и другие переменные (отсюда):

$1, $2, $3, ... являются позиционными параметрами , "$@" представляет собой массивную конструкцию всех позиционных параметров {$1, $2, $3 ...}. "$*" - это IFS-расширение всех позиционных параметров $1 $2 $3 .... $# - количество позиционных параметров. $- текущие параметры, установленные для оболочки. $$ pid текущей оболочки (не подоболочки). $_ самый последний параметр (или путь абзаца команды для запуска текущей оболочки сразу после запуска). $IFS является разделителем полей (ввода). $? является последним статусом выхода из проекта переднего плана. $! - это PID самой последней фоновой команды. $0 - это имя оболочки или сценария оболочки.
11
ответ дан 22 May 2018 в 19:42
  • 1
    Не говорите Windy, но на этот раз я голосую за ваш ответ, который, я думаю, охватывает широкий спектр специальных персонажей. Я думаю, что я получу значки для спортсменов, но, жадничать, мне действительно нравится ваш всеобъемлющий краткий ответ. Возможно, вы захотите опубликовать тот же ответ на: Специальные переменные в bash – WinEunuuchs2Unix 8 August 2017 в 05:39
  • 2
    @ WinEunuuchs2Unix Я написал альтернативу там, не уверен, что добавит что-нибудь полезное к этому вопросу, во всяком случае ...;) – Ravexina 8 August 2017 в 09:06

Вот реальное приложение $$, взятое из таймера блокировки экрана:

# Check if lock screen timer already running
pID=$(pgrep -f "${0##*/}") # All PIDs matching lock-screen-timer name
PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy ($$$)
if [ "$PREVIOUS" != "" ]; then
    kill "$PREVIOUS"
    rm ~/.lock-screen-timer-remaining
    zenity --info --title="Lock screen timer already running" --text="Previous lock screen timer has been terminated."
fi

В этом фрагменте кода строка:

PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy 

использует текущий запуск process ($$), чтобы удалить его (обозначенный не -v) из списка всех процессов, работающих под тем же именем (lock-screen-timer в этом случае).

Если был предыдущий запуск копия кода убивает его и удаляет рабочий файл, который он использовал.

1
ответ дан 22 May 2018 в 19:42
  • 1
    В grep -v ^"$$", ^ не означает «не» - v. -v заставляет grep отображать несогласованные строки вместо соответствующих. В регулярном выражении ^ означает только "не" когда он появляется сразу после открытия [ класса символов . Например, [^ac] соответствует любому символу кроме a или c. Вне классов символов ^ является anchor , который соответствует пустой строке в начале строки. Например, ^x соответствует x, который появляется в начале строки. – Eliah Kagan 8 August 2017 в 03:47
  • 2
    @EliahKagan Спасибо, что исправил меня. Я изменил параметр на -v. Вероятно, ^ был необходим, поскольку ссылка рабочего стола на скрипт имела модифицированную версию имени программы. Но для жизни я честно не могу вспомнить точную причину. Это было так давно, что я в последний раз отлаживал сценарий ... В любом случае, спасибо за ваше опытное понимание. – WinEunuuchs2Unix 8 August 2017 в 04:11
  • 3
    Я думаю, вы были правы, чтобы включить ^. Если текущий PID равен 2345, grep -v "$$" по капле 2345 по желанию, а также падение 12345. С grep -v ^"$$" удаляются только PID, которые действительно начинаются с 2345. Но мне приходит в голову, что PID, которые начинаются как текущие, но имеют дополнительные цифры, все еще удаляются. Предполагая, что это непреднамеренно, вы можете использовать grep -v ^"$$"$. ($ - привязка конца строки. Возможно, вы захотите его процитировать, но, как заметил здесь ОП, вам не нужно.) Или воспользуйтесь -x и используйте grep -vx "$$" или , так как его больше не нужно рассматривать как регулярное выражение grep -Fvx "$$". – Eliah Kagan 8 August 2017 в 04:48
  • 4
    Ах, три $ - это то, что у меня было в первоначальной версии, но Серг и другой парень принудили меня вытащить его и вернуться к двум $, мне придется пересмотреть весь вопрос на следующей неделе. Похоже, что это было просто правильно $ на неправильной стороне треков ". Еще раз спасибо за ваши замечательные идеи. – WinEunuuchs2Unix 8 August 2017 в 04:51
  • 5
    @EliahKagan Кажется, я был неправ , оглядываясь назад и о том, что сказал Серж и кто-то еще относительно "$$" против "$$$". Решение "$$$" нарушило мой скрипт, поэтому я вернулся к "$$". Я попробую ваше предложение "$$"$, которое, вероятно, предназначено для публикации в вышеупомянутой ссылке. – WinEunuuchs2Unix 8 August 2017 в 05:14

В bash для использования с использованием переменной мы используем $, используя $$ с первым знаком доллара, мы говорим, что я хочу использовать переменную и используя вторую, мы говорим, что имя этой переменной фактически $. это действительно соглашение об именах, и эта переменная содержит идентификатор процесса текущей оболочки.

Как вы просили в комментариях с $$$$, вы дважды возвращаете один и тот же идентификатор процесса.

Существуют и другие переменные (отсюда):

$1, $2, $3, ... являются позиционными параметрами , "$@" представляет собой массивную конструкцию всех позиционных параметров {$1, $2, $3 ...}. "$*" - это IFS-расширение всех позиционных параметров $1 $2 $3 .... $# - количество позиционных параметров. $- текущие параметры, установленные для оболочки. $$ pid текущей оболочки (не подоболочки). $_ самый последний параметр (или путь абзаца команды для запуска текущей оболочки сразу после запуска). $IFS является разделителем полей (ввода). $? является последним статусом выхода из проекта переднего плана. $! - это PID самой последней фоновой команды. $0 - это имя оболочки или сценария оболочки.
11
ответ дан 18 July 2018 в 08:55

Вот реальное приложение $$, взятое из таймера блокировки экрана:

# Check if lock screen timer already running pID=$(pgrep -f "${0##*/}") # All PIDs matching lock-screen-timer name PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy ($$$) if [ "$PREVIOUS" != "" ]; then kill "$PREVIOUS" rm ~/.lock-screen-timer-remaining zenity --info --title="Lock screen timer already running" --text="Previous lock screen timer has been terminated." fi

В этом фрагменте кода строка:

PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy

использует текущий запуск process ($$), чтобы удалить его (обозначенный не -v) из списка всех процессов, работающих под тем же именем (lock-screen-timer в этом случае).

Если был предыдущий запуск копия кода убивает его и удаляет рабочий файл, который он использовал.

1
ответ дан 18 July 2018 в 08:55

В bash для использования с использованием переменной мы используем $, используя $$ с первым знаком доллара, мы говорим, что я хочу использовать переменную и используя вторую, мы говорим, что имя этой переменной фактически $. это действительно соглашение об именах, и эта переменная содержит идентификатор процесса текущей оболочки.

Как вы просили в комментариях с $$$$, вы дважды возвращаете один и тот же идентификатор процесса.

Существуют и другие переменные (отсюда):

$1, $2, $3, ... являются позиционными параметрами , "$@" представляет собой массивную конструкцию всех позиционных параметров {$1, $2, $3 ...}. "$*" - это IFS-расширение всех позиционных параметров $1 $2 $3 .... $# - количество позиционных параметров. $- текущие параметры, установленные для оболочки. $$ pid текущей оболочки (не подоболочки). $_ самый последний параметр (или путь абзаца команды для запуска текущей оболочки сразу после запуска). $IFS является разделителем полей (ввода). $? является последним статусом выхода из проекта переднего плана. $! - это PID самой последней фоновой команды. $0 - это имя оболочки или сценария оболочки.
11
ответ дан 24 July 2018 в 19:12
  • 1
    Не говорите Windy, но на этот раз я голосую за ваш ответ, который, я думаю, охватывает широкий спектр специальных персонажей. Я думаю, что я получу значки для спортсменов, но, жадничать, мне действительно нравится ваш всеобъемлющий краткий ответ. Возможно, вы захотите опубликовать тот же ответ на: Специальные переменные в bash – WinEunuuchs2Unix 8 August 2017 в 05:39
  • 2
    @ WinEunuuchs2Unix Я написал альтернативу там, не уверен, что добавит что-нибудь полезное к этому вопросу, во всяком случае ...;) – Ravexina 8 August 2017 в 09:06

Вот реальное приложение $$, взятое из таймера блокировки экрана:

# Check if lock screen timer already running pID=$(pgrep -f "${0##*/}") # All PIDs matching lock-screen-timer name PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy ($$$) if [ "$PREVIOUS" != "" ]; then kill "$PREVIOUS" rm ~/.lock-screen-timer-remaining zenity --info --title="Lock screen timer already running" --text="Previous lock screen timer has been terminated." fi

В этом фрагменте кода строка:

PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy

использует текущий запуск process ($$), чтобы удалить его (обозначенный не -v) из списка всех процессов, работающих под тем же именем (lock-screen-timer в этом случае).

Если был предыдущий запуск копия кода убивает его и удаляет рабочий файл, который он использовал.

1
ответ дан 24 July 2018 в 19:12
  • 1
    В grep -v ^"$$", ^ не означает «не» - v. -v заставляет grep отображать несогласованные строки вместо соответствующих. В регулярном выражении ^ означает только "не" когда он появляется сразу после открытия [ класса символов . Например, [^ac] соответствует любому символу кроме a или c. Вне классов символов ^ является anchor , который соответствует пустой строке в начале строки. Например, ^x соответствует x, который появляется в начале строки. – Eliah Kagan 8 August 2017 в 03:47
  • 2
    @EliahKagan Спасибо, что исправил меня. Я изменил параметр на -v. Вероятно, ^ был необходим, поскольку ссылка рабочего стола на скрипт имела модифицированную версию имени программы. Но для жизни я честно не могу вспомнить точную причину. Это было так давно, что я в последний раз отлаживал сценарий ... В любом случае, спасибо за ваше опытное понимание. – WinEunuuchs2Unix 8 August 2017 в 04:11
  • 3
    Я думаю, вы были правы, чтобы включить ^. Если текущий PID равен 2345, grep -v "$$" по капле 2345 по желанию, а также падение 12345. С grep -v ^"$$" удаляются только PID, которые действительно начинаются с 2345. Но мне приходит в голову, что PID, которые начинаются как текущие, но имеют дополнительные цифры, все еще удаляются. Предполагая, что это непреднамеренно, вы можете использовать grep -v ^"$$"$. ($ - привязка конца строки. Возможно, вы захотите его процитировать, но, как заметил здесь ОП, вам не нужно.) Или воспользуйтесь -x и используйте grep -vx "$$" или , так как его больше не нужно рассматривать как регулярное выражение grep -Fvx "$$". – Eliah Kagan 8 August 2017 в 04:48
  • 4
    Ах, три $ - это то, что у меня было в первоначальной версии, но Серг и другой парень принудили меня вытащить его и вернуться к двум $, мне придется пересмотреть весь вопрос на следующей неделе. Похоже, что это было просто правильно $ на неправильной стороне треков ". Еще раз спасибо за ваши замечательные идеи. – WinEunuuchs2Unix 8 August 2017 в 04:51
  • 5
    @EliahKagan Кажется, я был неправ , оглядываясь назад и о том, что сказал Серж и кто-то еще относительно "$$" против "$$$". Решение "$$$" нарушило мой скрипт, поэтому я вернулся к "$$". Я попробую ваше предложение "$$"$, которое, вероятно, предназначено для публикации в вышеупомянутой ссылке. – WinEunuuchs2Unix 8 August 2017 в 05:14

Другие вопросы по тегам:

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