[Закрываются] полезные фрагменты кода Bash

Для тех, кто хочет подавить только StackTrace и не отбрасывать важные подсказки об ошибках, вы можете реализовать ExceptionFilter.

Вы можете сделать это в два этапа:

  1. Напишите свой фильтр следующим образом:

    using System.Web.Http.Filters;
    using System.Net;
    using System.Net.Http;
    
    public class MyExceptionFilterAttribute : ExceptionFilterAttribute
    {
        public override void OnException(HttpActionExecutedContext context)
        {
            var request = context.Request;
            var response = request.CreateErrorResponse(HttpStatusCode.InternalServerError, context.Exception.Message);
            var content = (System.Net.Http.ObjectContent)response.Content;
    
            var errorValues = (System.Web.Http.HttpError)content.Value;
            errorValues["ExceptionMessage"] = context.Exception.Message;
            errorValues["ExceptionType"] = context.Exception.GetType().Name;
            if (context.ActionContext != null)
            {
                errorValues["ActionName"] = context.ActionContext.ActionDescriptor.ActionName;
                errorValues["ControllerName"] = context.ActionContext.ControllerContext.ControllerDescriptor.ControllerName;
            }
    
            context.Response = response;
        }
    }
    
  2. заставить WebApi использовать ваш ExceptionFilter :

    public static void Register(HttpConfiguration config)
    {
        config.Filters.Add(new MyExceptionFilterAttribute());
    

Вы получите это:

{
  "Message": "Your exception is here!",
  "ExceptionMessage": "Your exception is here!",
  "ExceptionType": "Exception",
  "ActionName": "MyAction",
  "ControllerName": "MyController"
}

Дополнительная информация по адресу: https://docs.microsoft.com/en-us / САШ / веб-апи / обзор / обработки ошибок / обработки исключений

15
задан 3 revs, 2 users 62%user14070 23 May 2017 в 10:28
поделиться

20 ответов

There's cd - to go to the previously-visited directory:

/usr/local/bin> cd /i/am/a/banana
/i/am/a/banana> cd -
/usr/local/bin>

...and then there are all those useful incarnations of the BASH for-loop:

for file in *.txt; do ls $file; done

for item in $(echo foo bar baz); do echo $item; done

for num in {0..9}; do echo $num; done
18
ответ дан 30 November 2019 в 23:54
поделиться
: > truncate-file-to-zero-bytes.txt    # without changing its permissions  

См .: codenippets.joyent.com/posts/show/2067

0
ответ дан 30 November 2019 в 23:54
поделиться

Чтобы изменить все файлы в ~ , которые принадлежат группе vboxusers , должны принадлежать группе пользователей kent, я кое-что создал. Но поскольку у него был недостаток в использовании xargs, я заменяю его на решение, предложенное в комментарии к этому ответу:

$ find ~ -group vboxusers -exec chown kent:kent {} \;
0
ответ дан 30 November 2019 в 23:54
поделиться

В начале сценария, который должен запускаться от имени пользователя root:

if [ `id -u` != 0 ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi
2
ответ дан 30 November 2019 в 23:54
поделиться

Вот еще один:

#!/bin/bash

# Shows the full path of files, good for copy pasting and for when
# listing the full paths is necessary.

# Usage: Run in the working directory (no path), otherwise takes the
# same file specification as ls.

for file in $(ls "$@"); do
        echo -n $(pwd)
        [[ $(pwd) != "/" ]] && echo -n /
        echo $file
done
2
ответ дан 30 November 2019 в 23:54
поделиться

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

$ first=Joe
$ last=      # last name blank, the following echoes a space before the period
$ echo "Hello, $first $last. Welcome to..."
Hello, Joe . Welcome to...

$ echo "Hello, $first${last:+ $last}. Welcome to..."
Hello, Joe. Welcome to...

$ last=Green
$ echo "Hello, $first${last:+ $last}. Welcome to..."
Hello, Joe Green. Welcome to...
3
ответ дан 30 November 2019 в 23:54
поделиться

В сценарии BASH присвойте аргумент переменной, но укажите значение по умолчанию, если оно существует:

MYVAR=${1:-default}

$ MYVAR будет содержать первый аргумент, если был задан другой аргумент «по умолчанию».

14
ответ дан 30 November 2019 в 23:54
поделиться

Found this somewhere on the net a long time ago:

function bashtips {
cat <<EOF
DIRECTORIES
-----------
~-      Previous working directory
pushd tmp   Push tmp && cd tmp
popd        Pop && cd

GLOBBING AND OUTPUT SUBSTITUTION
--------------------------------
ls a[b-dx]e Globs abe, ace, ade, axe
ls a{c,bl}e Globs ace, able
\$(ls)      \`ls\` (but nestable!)

HISTORY MANIPULATION
--------------------
!!      Last command
!?foo       Last command containing \`foo'
^foo^bar^   Last command containing \`foo', but substitute \`bar'
!!:0        Last command word
!!:^        Last command's first argument
!\$     Last command's last argument
!!:*        Last command's arguments
!!:x-y      Arguments x to y of last command
C-s     search forwards in history
C-r     search backwards in history

LINE EDITING
------------
M-d     kill to end of word
C-w     kill to beginning of word
C-k     kill to end of line
C-u     kill to beginning of line
M-r     revert all modifications to current line
C-]     search forwards in line
M-C-]       search backwards in line
C-t     transpose characters
M-t     transpose words
M-u     uppercase word
M-l     lowercase word
M-c     capitalize word

COMPLETION
----------
M-/     complete filename
M-~     complete user name
M-@     complete host name
M-\$        complete variable name
M-!     complete command name
M-^     complete history
EOF
}
5
ответ дан 30 November 2019 в 23:54
поделиться

Слишком долго, чтобы включать все, но решения для Как мне управлять элементами $ PATH в сценариях оболочки? мне очень полезны ...

0
ответ дан 30 November 2019 в 23:54
поделиться

Пока нет HTTP push технологии, вы никогда не получите чат в реальном времени, только используя JavaScript .

# tested on Mac OS X

find -x -E . \( -type d -regex '.*/\.svn/*.*' -prune \) -ls  # test

find -x -E . \( -type d -regex '.*/\.svn/*.*' -prune \) -exec /bin/rm -PRfv '{}' \; 
2
ответ дан 30 November 2019 в 23:54
поделиться

Добрый день,

Мой любимый и применимый к другим оболочкам, поддерживающим псевдонимы, простой способ временно отключить псевдоним, добавив к команде обратную косую черту.

Итак:

alias rm='rm -i'

всегда будет давать вам интерактивный режим при вводе rm, ввод

\rm

в командной строке обходит псевдоним.

HTH

приветствует,

11
ответ дан 30 November 2019 в 23:54
поделиться

Это не так полезно, но действительно интересно:

history | awk '{print $2}' | awk 'BEGIN {FS="|"}{print $1}' | sort | uniq -c | sort -n | tail | sort -nr

Он выводит 10 наиболее часто используемых команд.

РЕДАКТИРОВАТЬ: Этот вопрос действительно похож на этот .

6
ответ дан 30 November 2019 в 23:54
поделиться

Мы разрабатываем веб-сайты и храним для них код в SVN. При переходе к производству мы не хотим, чтобы каталоги .svn отображались. Следующий код рекурсирует каталоги и удаляет ненужные (может использоваться для любых нежелательных каталогов). Не совсем bash, но, тем не менее, полезно.

find . -type d -name .svn | xargs rm -rf

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

Вы также можете выполнить обычный файл. изменив -тип d на -тип f

1
ответ дан 30 November 2019 в 23:54
поделиться

Я использую это для отступа исходного кода на четыре пробела и копирования результата в буфер обмена в X:

cat src/Something.java | sed -e 's/^/    /g' | xsel

Теперь Something.java готов вставляется средней кнопкой мыши. Я знаю, что могу уменьшить выражение на одну вертикальную черту и удалить кота, но мне это нравится, поскольку мне легче редактировать начало при повторном использовании выражения.

0
ответ дан 30 November 2019 в 23:54
поделиться

Эффективный (и интуитивно понятный) способ получить полный канонический путь к указанному файлу. Это разрешит все случаи символических ссылок, относительных ссылок на файлы и т. Д.

full_path="$(cd $(/usr/bin/dirname "$file"); pwd -P)/$(/usr/bin/basename "$file")"
0
ответ дан 30 November 2019 в 23:54
поделиться

Я часто использую этот в сочетании с разработкой на Java:

#!/bin/sh

if [ "$1" == "" ] || [ "$2" == "" ]; then
echo "Usage jarfinder.sh  "
    exit
fi

SEARCH=`echo $2 | sed -e 's/[\\\/]/./g'`

echo Searching jars and zips in $1 for "$SEARCH"

find $1 -type f -printf "'%p'\n" | egrep "\.(jar|zip)'$" | sed -e "s/\(.*\)/echo \1 ; jar tvf \1 | sed -e 's\/^\/ \/' | grep -i \"$SEARCH\"/" | sh

, который я храню в своей коллекции удобных скриптов .

Я также использую этот- лайнер много:

find . -name "*.java" | xargs grep -li "yadayada"

конец этого:

find . -name "*.java" | sed -e 's+\(.*\)+echo \1 ; yada_cmd \1+' | sh
1
ответ дан 30 November 2019 в 23:54
поделиться

Вот красивое выражение grep для удаления пустых строк и строк комментариев:

grep -v '^[ \t]*$\|^[ \t]*#' /etc/ssh/sshd_config

Выше будут отображены используемые настройки в sshd_config без каких-либо помех.

2
ответ дан 30 November 2019 в 23:54
поделиться

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

Этот класс программы принимает поток входных символов («исходный код»), которые могут обычно описываться формальной грамматикой и выводить поток символов.

Этот выходной поток символов может быть:

  • Собственный код сборки, обычно для операционной системы и оборудования, на котором работает машина. Если это так, программа называется компилятором;
  • Собственный код сборки для другой ОС и/или оборудования. Это тоже можно назвать компилятором, но часто называют кросс-компилятором;
  • К промежуточной форме, которая может быть выполнена виртуальной машиной какого-то рода. Это не настоящий компилятор, но в любом случае его часто называют компилятором. В эту категорию попадают компиляторы Java, C #, F #, VB.NET и т. д.
  • На другой язык целиком. Это называется переводчиком и есть примеры, скажем, переводчиков Java на C #. Они обычно имеют разную степень успеха, потому что идиомы часто не легко переводить;
  • Переводчики следуют тому же принципу, но обычно выполняют обработанную форму на месте, а не где-то. В эту категорию попадают сценарии Perl, PHP и shell. Например, PHP хранит opcode в кэше opcode в качестве промежуточной формы (если кэширование opcoding включено), но эта промежуточная форма не сохраняется, поэтому по-прежнему безопасно вызывать PHP интерпретатором.
-121--3832585-

хорошо, если Список действительно является списком < T > , вы сможете сделать:

recipes = context.Recipes.Where(recipe => recipe.IngredientList.Exists(i => i.Id == ingredient.Id)).ToList();

, но это означает, что весь список должен быть заполнен. Поскольку это выглядит как запрос LINQ к SQL, я предполагаю, что Список ошибок является просто связанной таблицей...? В этом случае у вас не будет полного списка, но вы все равно сможете сделать что-то подобное:

recipes = context.Recipes.Where(recipe => recipe.IngredientList.Count(i => i.Id == ingredient.Id) > 0).ToList();

... и он все равно должен просто запросить SQL-сервер один раз.

EDIT

Как было только что указано в комментариях, это не совсем отвечает на вопрос. Что касается содержит - все поиск, я не думаю, что это может быть сделано без закольцовывания через вход. Хорошо то, что это можно сделать без перечисления IEnumerable рецептов , так что приведенный ниже код все еще попадет на сервер SQL один раз, с одним запросом:

var recipes = context.Recipes.AsEnumerable<Recipe>();

ingredients.ForEach(i =>
    var recipes = recipes.Where(r =>
        r.IngredientList.Count(ii => ii.Id == i.Id) > 0
    );
);

return recipes.ToList();

Запрос не будет выполняться до тех пор, пока не будет сбит ToList () .

-121--4043508-

Я использую это для запуска приложений в их собственном окне xterm (или нет) по той же ссылке.

#!/bin/bash
#
# cli_app launcher -- detects where u are launching from;  gui/tty
# 

dev=`/usr/bin/tty`
case $dev in
/dev/pts/0 | /dev/pts/1) xterm -e /home/user/bin/cli_app ;; ## opens gui terminal
*) /home/user/bin/cli_app ;;                                 ## opens where u are
esac

# eof #
0
ответ дан 30 November 2019 в 23:54
поделиться
 !find:p  ......... show last find command - not execute
 # create one dir and go to
 echo 'mkcd() { mkdir -p "$@" && cd $_; }' >> ~/.bashrc  

 # backup file in single command
 cp /path/too/long/to/file{,.backup}
1
ответ дан 30 November 2019 в 23:54
поделиться

Если вы хотите, чтобы ваш текущий рабочий каталог отображался в приглашении ( $ PS1 ), используйте терминал только с 80 столбцами, а иногда и в очень глубоких иерархиях. , вы можете получить приглашение, которое займет всего около 5 символов вашей строки. В этом случае полезны следующие объявления:

PS1='${PWD##$PREFIX}$ '

PREFIX='' export PREFIX
prefix () {
  PREFIX="$1"
}
prefix '*/'

Вызов префикса '* /' установит ваше приглашение, чтобы оно содержало только последний элемент каталога вашего текущего рабочего каталога (вместо полного пути). Если вы хотите увидеть весь путь, вызовите префикс без аргументов.

1
ответ дан 30 November 2019 в 23:54
поделиться
Другие вопросы по тегам:

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