echo $?
вернет код ошибки из предыдущей команды.
try
false ; echo $?
true ; echo $?
ls >> $ File 2> & 1
, перенаправит ( >>
) вывод ls в конец файла, имя которого находится в $ File
], 2> & 1
также перенаправит ошибку, если таковая имеется.
>>
означает «добавить в файл». Эти флаги определены в файлах спецификаций GCC , поэтому лучший способ определить различия между ними — заглянуть туда:
gcc -dumpspecs
Соответствующей частью является link_command
определение. Это показывает, что -nostdlib
, -nodefaultlibs
и -nostartfiles
имеют следующее влияние:
%{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}}
— при необходимости добавляет libgcc
, libpthread
, libc
, libieee
с помощью макроса и спецификационных строк lib
и libgcc
; %{!nostdlib:%{!nostartfiles:%S}}
— это добавляет спецификационную строку startfile
, в которой указываются объектные файлы, добавляемые для обработки запуска(crti.o
и т. д.)%{!nostdlib:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end} %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}
— добавляет проверку виртуальной таблицы с помощьюlibvtv
%{!nostdlib:%{!nodefaultlibs:%{mmpx:%{fcheck-pointer-bounds: %{static:--whole-archive -lmpx --no-whole-archive %:include(libmpx.spec)%(link_libmpx)} %{!static:%{static-libmpx:-Bstatic --whole-archive} %{!static-libmpx:--push-state --no-as-needed} -lmpx %{!static-libmpx:--pop-state} %{static-libmpx:--no-whole-archive -Bdynamic %:include(libmpx.spec)%(link_libmpx)}}}}%{mmpx:%{fcheck-pointer-bounds:%{!fno-chkp-use-wrappers: %{static:-lmpxwrappers} %{!static:%{static-libmpxwrappers:-Bstatic} -lmpxwrappers %{static-libmpxwrappers: -Bdynamic}}}}}}}
— это ручкиlibmpx
%{!nostdlib:%{!nodefaultlibs:%{%:sanitize(address): %{static-libasan:%:include(libsanitizer.spec)%(link_libasan)} %{static:%ecannot specify -static with -fsanitize=address}} %{%:sanitize(thread): %{static-libtsan:%:include(libsanitizer.spec)%(link_libtsan)} %{static:%ecannot specify -static with -fsanitize=thread}} %{%:sanitize(undefined):%{static-libubsan:-Bstatic} -lubsan %{static-libubsan:-Bdynamic} %{static-libubsan:%:include(libsanitizer.spec)%(link_libubsan)}} %{%:sanitize(leak): %{static-liblsan:%:include(libsanitizer.spec)%(link_liblsan)}}}}
— управляет различными вариантами санитарной обработки %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}
— это добавляет опции защиты стека и повторяет последовательность ссылок C (, библиотеки которых уже были указаны в начале)%{!nostdlib:%{!nostartfiles:%E}}
— это добавляет спецификационную строку endfile
, которая указывает объектные файлы, которые нужно добавить для обработки левых -оверов (crtfastmath.o
, crtend.o
и т. д.)Как вы поняли из документации, -nostdlib
является надмножеством -nodefaultlibs
и -nostartfiles
. Он также отключает проверку виртуальной таблицы.
Итак, -nostdlib
достаточно, чтобы отключить все связанные функции; -nodefaultlibs
и -nostartfiles
ничего к этому не добавляют. (Но их тоже не помешает упомянуть.)