PowerShell differences on non-Windows platforms
PowerShell strives to provide feature parity across all supported platforms. However, some features behave differently or aren't available due to differences in .NET Core and platform-specific differences. Other changes were made to improve the interoperability of PowerShell on non-Windows platforms.
.NET Framework vs .NET Core
PowerShell on Linux and macOS uses .NET Core, a subset of the full .NET Framework on Microsoft Windows. As a result, scripts that run on Windows might not run on non-Windows platforms because of the differences in the frameworks.
For more information about changes in .NET Core, see Breaking changes for migration from .NET Framework to .NET Core.
General Unix interoperability changes
- Added support for native command globbing on Unix platforms. This means you can use wildcards with
native commands like
ls *.txt
. - The
more
functionality respects the Linux$PAGER
and defaults toless
. - Trailing backslash is automatically escaped when dealing with native command arguments.
- Fixed ConsoleHost to honor
NoEcho
on Unix platforms. - Don't add
PATHEXT
environment variable on Unix. - A
powershell
man-page is included in the package.
Execution policy
PowerShell ignores execution policies when running on non-Windows platforms. Get-ExecutionPolicy
returns Unrestricted on Linux and macOS. Set-ExecutionPolicy
does nothing on Linux and macOS.
Case-sensitivity in PowerShell
Historically, PowerShell has been uniformly case-insensitive, with few exceptions. On UNIX-like operating systems, the file system is predominantly case-sensitive, and PowerShell adheres to the standard of the file system.
- You must use the correct case when a filename in specified in PowerShell.
- If a script tries to load a module and the module name isn't cased correctly, then the module load fails. This behavior might cause a problem with existing scripts if the name referenced by the module doesn't match the proper case of the actual filename.
- While names in the filesystem are case-sensitive, tab-completion of filenames isn't case-sensitive. Tab-completion cycles through the list of names using case-insensitive matching.
Get-Help
supports case-insensitive pattern matching on Unix platforms.Import-Module
is case insensitive when used with a filename to determine the module name.
Filesystem support for Linux and macOS
- Paths given to cmdlets are now slash-agnostic (both
/
and\
work as directory separators) - XDG Base Directory Specification is now respected and used by default:
- The Linux/macOS profile path is located at
~/.config/powershell/profile.ps1
- The history save path is located at
~/.local/share/powershell/PSReadline/ConsoleHost_history.txt
- The user module path is located at
~/.local/share/powershell/Modules
- The Linux/macOS profile path is located at
- Support for file and folder names containing the colon character on Unix.
- Support for script names or full paths that have commas.
- Detect when the LiteralPath parameter is used to suppress wildcard expansion for navigation cmdlets.
- Updated
Get-ChildItem
to work more like the *nixls -R
and the WindowsDIR /S
native commands.Get-ChildItem
now returns the symbolic links encountered during a recursive search and doesn't search the directories that those links target.
.PS1 File Extensions
PowerShell scripts must end in .ps1
for the interpreter to understand how to load and run them in
the current process. Running scripts in the current process is the expected usual behavior for
PowerShell. You can add the #!
magic number to a script that doesn't have a .ps1
extension, but
this causes the script to be run in a new PowerShell instance, preventing the script from working
correctly when interchanging objects. This behavior might be desirable when executing a PowerShell
script from Bash or another shell.
Convenience aliases removed
PowerShell provides a set of aliases on Windows that map to Linux command names for user
convenience. On Linux and macOS, the "convenience aliases" for the basic commands ls
, cp
, mv
,
rm
, cat
, man
, mount
, and ps
were removed to allow the native executable to run without
specifying a path.
Logging
On macOS, PowerShell uses the native os_log
APIs to log to Apple's unified logging system.
On Linux, PowerShell uses Syslog, a ubiquitous logging solution.
Job Control
There's no Unix-style job-control support in PowerShell on Linux or macOS. The fg
and bg
commands aren't available. However, you can use PowerShell jobs that work on all platforms.
Putting &
at the end of a pipeline causes the pipeline to be run as a PowerShell job. When a
pipeline is backgrounded, a job object is returned. Once the pipeline is running as a job, all
*-Job
cmdlets can be used to manage the job. Variables (ignoring process-specific variables) used
in the pipeline are automatically copied to the job so Copy-Item $foo $bar &
just works. The job
runs in the current directory instead of the user's home directory.
Remoting Support
PowerShell Remoting (PSRP) using WinRM on Unix platforms requires NTLM/Negotiate or Basic Auth over HTTPS. PSRP on macOS only supports Basic Auth over HTTPS. Kerberos-based authentication isn't supported.
PowerShell supports PowerShell Remoting (PSRP) over SSH on all platforms (Windows, Linux, and macOS). For more information, see SSH remoting in PowerShell.
Just-Enough-Administration (JEA) Support
PowerShell on Linux or macOS doesn't allow you to create constrained administration (JEA) remoting endpoints.
sudo
, exec
, and PowerShell
Because PowerShell runs most commands in memory (like Python or Ruby), you can't use sudo
directly
with PowerShell built-ins. You can run pwsh
from sudo
. If it's necessary to run a PowerShell
cmdlet from within PowerShell with sudo
, for example, sudo Set-Date 8/18/2016
, then you would
use sudo pwsh Set-Date 8/18/2016
.
Modules included on non-Windows platforms
For non-Windows platforms, PowerShell includes the following modules:
- Microsoft.PowerShell.Archive
- Microsoft.PowerShell.Core
- Microsoft.PowerShell.Host
- Microsoft.PowerShell.Management
- Microsoft.PowerShell.Security
- Microsoft.PowerShell.Utility
- PackageManagement
- PowerShellGet
- PSReadLine
- ThreadJob
A large number of the commands (cmdlets) commonly available in PowerShell aren't available on Linux
or macOS. Often, these commands don't apply to these platforms. For example, commands for
Windows-specific features like the registry or services aren't available. Other commands, like
Set-ExecutionPolicy
, are present but not functional.
For a comprehensive list of modules and cmdlets and the platforms they support, see Release history of modules and cmdlets.
Modules no longer shipped with PowerShell
For various compatibility reasons, the following modules are no longer included in PowerShell.
- ISE
- Microsoft.PowerShell.LocalAccounts
- Microsoft.PowerShell.ODataUtils
- Microsoft.PowerShell.Operation.Validation
- PSScheduledJob
- PSWorkflow
- PSWorkflowUtility
The following Windows-specific modules aren't included in PowerShell for Linux or macOS.
- CimCmdlets
- Microsoft.PowerShell.Diagnostics
- Microsoft.WSMan.Management
- PSDiagnostics
Cmdlets not available on non-Windows platforms
Some cmdlets were removed from PowerShell. Others aren't available or might work differently on non-Windows platforms. For a comprehensive list of cmdlets removed from PowerShell, see Cmdlets removed from PowerShell.
Microsoft.PowerShell.Core
The following cmdlets aren't available on Linux or macOS:
Disable-PSRemoting
Enable-PSRemoting
Connect-PSSession
Disconnect-PSSession
Receive-PSSession
Get-PSSessionCapability
Disable-PSSessionConfiguration
Enable-PSSessionConfiguration
Get-PSSessionConfiguration
Register-PSSessionConfiguration
Set-PSSessionConfiguration
Unregister-PSSessionConfiguration
Test-PSSessionConfigurationFile
The ShowWindow parameter of Get-Help
isn't available for non-Windows platforms. PowerShell 7.3
added the Switch-Process
cmdlet and the exec
function for Linux and macOS. These commands aren't
available on Windows.
Microsoft.PowerShell.Security cmdlets
The following cmdlets aren't available on Linux or macOS:
Get-Acl
Set-Acl
Get-AuthenticodeSignature
Set-AuthenticodeSignature
New-FileCatalog
Test-FileCatalog
These cmdlets are only available beginning in PowerShell 7.1.
Get-CmsMessage
Protect-CmsMessage
Unprotect-CmsMessage
Microsoft.PowerShell.Management cmdlets
The following cmdlets aren't available on Linux and macOS:
Rename-Computer
Get-ComputerInfo
Get-HotFix
Clear-RecycleBin
Get-Service
New-Service
Remove-Service
Restart-Service
Resume-Service
Set-Service
Start-Service
Stop-Service
Suspend-Service
Set-TimeZone
The following cmdlets are available with limitations:
Get-Clipboard
- available in PowerShell 7.0+Set-Clipboard
- available in PowerShell 7.0+Restart-Computer
- available for Linux and macOS in PowerShell 7.1+Stop-Computer
- available for Linux and macOS in PowerShell 7.1+
Microsoft.PowerShell.Utility cmdlets
The following cmdlets aren't available on Linux and macOS:
Convert-String
ConvertFrom-String
ConvertFrom-SddlString
Out-GridView
Out-Printer
Show-Command
Aliases not available on Linux or macOS
The following table lists the aliases available for Windows that aren't available on non-Windows platforms. These aliases aren't available because the alias conflicts with a native command on those platforms.
Alias | Cmdlet |
---|---|
ac |
Add-Content |
cat |
Get-Content |
clear |
Clear-Host |
compare |
Compare-Object |
cp |
Copy-Item |
cpp |
Copy-ItemProperty |
diff |
Compare-Object |
kill |
Stop-Process |
ls |
Get-ChildItem |
man |
help |
mount |
New-PSDrive |
mv |
Move-Item |
ps |
Get-Process |
rm |
Remove-Item |
rmdir |
Remove-Item |
sleep |
Start-Sleep |
sort |
Sort-Object |
start |
Start-Process |
tee |
Tee-Object |
write |
Write-Output |
The table doesn't include aliases unavailable for cmdlets that don't exist on non-Windows platforms.
PowerShell Desired State Configuration (DSC)
Beginning with PowerShell 7.2, the PSDesiredStateConfiguration module was removed from PowerShell and is published in the PowerShell Gallery. For more information, see the announcement on the PowerShell Team blog. For more information about using DSC on Linux, see Get started with DSC for Linux. DSC v1.1 and v2.x aren't supported on macOS. DSC v3 is supported on Windows, Linux, and macOS, but it's still in early development.