/proc/$$/environ
и переменная environ
независимы. environ
действительно отражает изменения в среде, и на самом деле значение указателя в environ
также изменяется, когда переменные среды добавляются в среду через putenv()
(, но это детали реализации.)
Нам придется различать уровень системного вызова и уровень библиотеки. На уровне системного вызова единственным механизмом, связанным со средой, является аргумент envp
для вызова execve
. Ожидается, что этот параметр будет содержать пары name=value
, составляющие среду новой программы. Эта среда копируется в стек нового процесса, откуда ее может подобрать стартовый код пользовательского пространства.
На уровне библиотеки у нас есть
environ
, указывающая на копию окружения getenv()
и putenv()
для изучения и изменения окружения exec*
функций (, не включая execve
), которые либо неявно (через environ
), либо явно (передаются через параметр )получают доступ к среде Библиотечные функции exec*
в конечном итоге вызывают системный вызов execve
. Переменная environ
не указывает на среду в стеке; вместо этого среда копируется в кучу процесса перед установкой переменной environ
(это опять-таки деталь реализации.)
Почему /proc/$$/environ
не отражает изменений в окружающей среде?/proc/$$/environ
— это виртуальный файл, предоставляемый ядром, и ядро не имеет возможности узнать, что происходит на этом низком уровне адресного пространства пользовательского процесса. Ядро ничего не знает о переменной environ
и не знает о структурах данных, используемых процессом для хранения среды.
Эта команда awk проверит, является ли значение последнего столбца > 1 или оно содержит какие-либо другие символы (, кроме цифр и точек)
$ awk 'NR>1 && ($NF>1 || $NF~/[^0-9.]/)' test.txt
rs534 0.22 A G 0.245B
rs947 -0.07 T G 1.00002
rs667 0.37 C T 0.0A4
$ cat test.txt
SNP Beta A1 A2 P
rs124 -0.5 T C 0.11
rs534 0.22 A G 0.245B
rs199 1.32 G C 0.345
rs947 -0.07 T G 1.00002
rs667 0.37 C T 0.0A4
rs667 0.37 C T 0.04
Предупреждающее сообщение, по-видимому, указывает на «закрытое множество» (открытое с «левой» стороны, закрытое с «правой» )НЕ включая 0. Попробуйте это дополнение прекрасного предложения Камараджа:
awk 'NR>1 && ($NF>1 || $NF~/[^0-9.]/ || $NF == 0)' file