Каталог сценария изменения к homedir пользователя в сценарии оболочки

С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):

Get-ChildItem -path C:\ -recurse -Filter *.txt -ErrorAction Continue | 
    ForEach-Item -Process {
        Start-Sleep -Seconds 1
        

С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):

[110]

Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter, который является кратким способом написания функции с поддержкой конвейера :

filter Delay-Object ([int]$Milliseconds) {
    Start-Sleep -Milliseconds $Milliseconds
    

С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):

[110]

Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter, который является кратким способом написания функции с поддержкой конвейера :

[111]

Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:

Get-ChildItem \\my\share\*.* | ForEach-Object {
    # do your search here
}

Вы можете просто ввести задержку прямо в вашу итерацию:

Get-ChildItem \\my\share\*.* | ForEach-Object {
    Start-Sleep -Seconds 1
    # do your search here
}

Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String:

Get-ChildItem \\my\share\*.* | Select-String findme

Тогда решение остается тем же: вставьте ForEach-Object!

Get-ChildItem \\my\share\*.* | 
    ForEach-Object {
        Start-Sleep -Seconds 1
        

С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):

[110]

Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter, который является кратким способом написания функции с поддержкой конвейера :

[111]

Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:

[112]

Вы можете просто ввести задержку прямо в вашу итерацию:

[113]

Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String:

[114]

Тогда решение остается тем же: вставьте ForEach-Object!

[115]

Вы можете подумать, что Get-ChildItem собирается найти все файлы сначала и передайте их все вместе, и это даже будет слишком большой нагрузкой на сетевые диски, но конвейер не работает таким образом. * sup>

Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.

* некоторым конвейерным командам, таким как Sort-Object, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки. sup>

# have to return the original object back to the pipeline } | Select-String findme

Вы можете подумать, что Get-ChildItem собирается найти все файлы сначала и передайте их все вместе, и это даже будет слишком большой нагрузкой на сетевые диски, но конвейер не работает таким образом. * sup>

Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.

* некоторым конвейерным командам, таким как Sort-Object, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки. sup>

} Get-ChildItem -path C:\ -recurse -Filter *.txt -ErrorAction Continue | Delay-Object -Milliseconds 1000 | Select-String -Pattern "xxxx" | select filename, Linenumber, Line, Path | Format-Table

Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:

Get-ChildItem \\my\share\*.* | ForEach-Object {
    # do your search here
}

Вы можете просто ввести задержку прямо в вашу итерацию:

Get-ChildItem \\my\share\*.* | ForEach-Object {
    Start-Sleep -Seconds 1
    # do your search here
}

Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String:

Get-ChildItem \\my\share\*.* | Select-String findme

Тогда решение остается тем же: вставьте ForEach-Object!

Get-ChildItem \\my\share\*.* | 
    ForEach-Object {
        Start-Sleep -Seconds 1
        

С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):

[110]

Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter, который является кратким способом написания функции с поддержкой конвейера :

[111]

Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:

[112]

Вы можете просто ввести задержку прямо в вашу итерацию:

[113]

Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String:

[114]

Тогда решение остается тем же: вставьте ForEach-Object!

[115]

Вы можете подумать, что Get-ChildItem собирается найти все файлы сначала и передайте их все вместе, и это даже будет слишком большой нагрузкой на сетевые диски, но конвейер не работает таким образом. * sup>

Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.

* некоторым конвейерным командам, таким как Sort-Object, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки. sup>

# have to return the original object back to the pipeline } | Select-String findme

Вы можете подумать, что Get-ChildItem собирается найти все файлы сначала и передайте их все вместе, и это даже будет слишком большой нагрузкой на сетевые диски, но конвейер не работает таким образом. * sup>

Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.

* некоторым конвейерным командам, таким как Sort-Object, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки. sup>

} | Select-String -Pattern "xxxx" | select filename, Linenumber, Line, Path | Format-Table

Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter, который является кратким способом написания функции с поддержкой конвейера :

filter Delay-Object ([int]$Milliseconds) {
    Start-Sleep -Milliseconds $Milliseconds
    

С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):

[110]

Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter, который является кратким способом написания функции с поддержкой конвейера :

[111]

Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:

Get-ChildItem \\my\share\*.* | ForEach-Object {
    # do your search here
}

Вы можете просто ввести задержку прямо в вашу итерацию:

Get-ChildItem \\my\share\*.* | ForEach-Object {
    Start-Sleep -Seconds 1
    # do your search here
}

Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String:

Get-ChildItem \\my\share\*.* | Select-String findme

Тогда решение остается тем же: вставьте ForEach-Object!

Get-ChildItem \\my\share\*.* | 
    ForEach-Object {
        Start-Sleep -Seconds 1
        

С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):

[110]

Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter, который является кратким способом написания функции с поддержкой конвейера :

[111]

Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:

[112]

Вы можете просто ввести задержку прямо в вашу итерацию:

[113]

Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String:

[114]

Тогда решение остается тем же: вставьте ForEach-Object!

[115]

Вы можете подумать, что Get-ChildItem собирается найти все файлы сначала и передайте их все вместе, и это даже будет слишком большой нагрузкой на сетевые диски, но конвейер не работает таким образом. * sup>

Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.

* некоторым конвейерным командам, таким как Sort-Object, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки. sup>

# have to return the original object back to the pipeline } | Select-String findme

Вы можете подумать, что Get-ChildItem собирается найти все файлы сначала и передайте их все вместе, и это даже будет слишком большой нагрузкой на сетевые диски, но конвейер не работает таким образом. * sup>

Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.

* некоторым конвейерным командам, таким как Sort-Object, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки. sup>

} Get-ChildItem -path C:\ -recurse -Filter *.txt -ErrorAction Continue | Delay-Object -Milliseconds 1000 | Select-String -Pattern "xxxx" | select filename, Linenumber, Line, Path | Format-Table

Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:

Get-ChildItem \\my\share\*.* | ForEach-Object {
    # do your search here
}

Вы можете просто ввести задержку прямо в вашу итерацию:

Get-ChildItem \\my\share\*.* | ForEach-Object {
    Start-Sleep -Seconds 1
    # do your search here
}

Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String:

Get-ChildItem \\my\share\*.* | Select-String findme

Тогда решение остается тем же: вставьте ForEach-Object!

Get-ChildItem \\my\share\*.* | 
    ForEach-Object {
        Start-Sleep -Seconds 1
        

С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):

[110]

Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter, который является кратким способом написания функции с поддержкой конвейера :

[111]

Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:

[112]

Вы можете просто ввести задержку прямо в вашу итерацию:

[113]

Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String:

[114]

Тогда решение остается тем же: вставьте ForEach-Object!

[115]

Вы можете подумать, что Get-ChildItem собирается найти все файлы сначала и передайте их все вместе, и это даже будет слишком большой нагрузкой на сетевые диски, но конвейер не работает таким образом. * sup>

Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.

* некоторым конвейерным командам, таким как Sort-Object, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки. sup>

# have to return the original object back to the pipeline } | Select-String findme

Вы можете подумать, что Get-ChildItem собирается найти все файлы сначала и передайте их все вместе, и это даже будет слишком большой нагрузкой на сетевые диски, но конвейер не работает таким образом. * sup>

Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.

* некоторым конвейерным командам, таким как Sort-Object, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки. sup>

5
задан Sergey Golovchenko 6 February 2009 в 20:38
поделиться

4 ответа

Что относительно

cd $(getent passwd foo | cut -d: -f6)

и

USER=foo
eval cd ~$USER

работы, также (нечто является именем пользователя),

15
ответ дан 18 December 2019 в 07:11
поделиться

Есть ли некоторая причина, которую Вы не можете сделать:

#!/bin/bash

cd /home/$USER

Конечно, каталоги не находятся в / домой на всех *, отклоняет, но предположение, что Вы знаете то, для чего ОС/дистрибутива предназначен Ваш сценарий, необходимо смочь придумать что-то, что работает достаточно хорошо.

-1
ответ дан 18 December 2019 в 07:11
поделиться

Скрипт собирается быть запущенным пользователем? Если это - Вы, может просто сделать: cd ~

0
ответ дан 18 December 2019 в 07:11
поделиться

Измените его на:

cd $HOME

На самом деле я не уверен почему cd ~whatever не работал бы. Я только что протестировал с маленьким сценарием, и он хорошо работал:

#!/bin/bash

cd ~sbright

Я на самом деле получаю то же сообщение об ошибке, что Вы делаете, когда указанный пользователь не существует в системе. Вы уверены (и да, я знаю, что это - один из тех is-it-plugged-in вопросов), что пользователь существует, и действительный корневой каталог указал?

Править:

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

8
ответ дан 18 December 2019 в 07:11
поделиться